الوصول إلى المتغيرات في موصل

I’m great at system administration. I’m not bad at doing stuff in rails. With javascript, ember, and CSS,I am just a caveman.

In a plugin that changes who can send PMs, I am trying to add a button to the profile page when the user does not have permission to send a PM. I can add text right where I want it by putting stuff in assets/javascripts/discourse/templates/connectors/user-summary-stat/my-clever-name.hbs. (There was much rejoicing!).

I see that https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/templates/user/messages.hbs#L3 uses

    {{#if showNewPM}}

I’d like to use that in my-clever-name.hbs, but that variable isn’t defined.

I think that maybe I need to create a my-clever-name.js.es6 in the same directory as my hbs file and include . . . something, and/or add some code that defines that variable so that I can access it, but I’ve re-read the developer’s guide a few times as well as tried to mimic code in some plugins that seem like they’re doing the same, but don’t see just how to do that.

إعجابَين (2)

Hi Jay,

I’ve heard people state EmberJS is “a language in itself”!

What you need is a Computed Property:

Though the Discourse source syntax is a bit different as well as the imports, it’s best to look for an example. Here’s a bit of my code:

https://github.com/paviliondev/discourse-zspace/blob/cc8893c14a9b1c5d4f6552f8f6b12ea9ac7ac643/assets/javascripts/discourse/components/activity-file-edit.js.es6#L10

إعجابَين (2)

So that @discourseComputied("uploading") makes it so that uploading can be used in an hbs template? Sort of like


fullName: computed('firstName', 'lastName', function() {
    return `${this.firstName} ${this.lastName}`;
  })

would in Ember?

So I’ll create assets/javascripts/discourse/components/my-plugin.js.es6 and extend . . . something . . .? It would seem like there’d be a way that I could just “turn on” those same variables that the other template I’m extending has access to. OH! Maybe extending that thing would in my component make those variables available to me?

Should I punt and back up and spend a week on the Ember tutorial?

So this is setting up a computed property called ‘fullName’ which is updated whenever ‘firstName’ or ‘lastName’ change. It becomes the value of the return.

إعجاب واحد (1)

Thanks for your patience!

I think I get that, what I don’t understand is how I can make values that I can access in my template.

assets/javascript/discourse/components/user-private-messages.js.es6:

import discourseComputed from "discourse-common/utils/decorators";
import User from "discourse/controllers/user";

export default Ember.Component.extend(User, {
    classNames: ["restrict-pms"],
    myFunThing: "this is text in my fun thing",
    @discourseComputed("myvalue")
    someThing(myvalue) {
        return true;
    }
});

Template.registerHelper("log", function(something){
    console.log(something);
});

I think what I’m asking, which might not make sense, is what can I put in assets/javascripts/discoures/templates/connectors/user-profile-controls/add-link-to-subscription.hbs to be able to access myFunThing or myvalue?

The template which corresponds to your component js can refer to your computed property simply by including it within double curlies:

{{fullName}}

إعجاب واحد (1)

The above code is in assets/javascript/discourse/components/user-private-messages.js.es6.

And I want to be able to use {{myFunThing}} and/or {{myvalue}} in assets/javascripts/discourse/templates/connectors/user-profile-controls/add-link-to-subscription.hbs but it’s undefined.

I believe that either one of those files is in the wrong place (I see that other text in the above hbs file is rendered on /u/username/summary, just without myFunThing), or that I’m importing the wrong class and/or I’m extending the wrong component.

عذرًا يا جاي، أنا مشغول قليلًا، لكن ما يمكنك فعله هو ببساطة ربط المكون الخاص بك في ملف hbs داخل ملف connector.hbs على سبيل المثال:

{{my-component}}

(أضف الحجج حسب الحاجة)

ستقوم بعد ذلك بالبحث عن my-component.hbs في templates/components و /components.

بدلاً من ذلك، يجب أن تتمكن من تعيين الخاصية في ملف js داخل مجلد connector، لكن بالنسبة لأسلوبي، أفضل الطريقة الأولى.

إعجابَين (2)

أعلم أن هذا من عام مضى، ولكن هل تمكنت من حل هذه المشكلة يا @pfaffman؟

أرجو ألا يكون هذا للمشروع نفسه (غير المكتمل)، ولكن إليك:

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/assets/javascripts/discourse/templates/pfaffmanager-servers-show.hbs

الذي يستدعي:

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/assets/javascripts/discourse/templates/components/server-item.hbs

وأعتقد:

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/assets/javascripts/discourse/controllers/pfaffmanager-servers-show-item.js.es6

إعجاب واحد (1)