Доступ к переменным в коннекторе

Я отлично справляюсь с системным администрированием. В Rails я тоже не новичок. А вот с JavaScript, Ember и CSS я чувствую себя как первобытный человек.

В плагине, который изменяет права на отправку личных сообщений, я пытаюсь добавить кнопку на страницу профиля, если у пользователя нет разрешения отправлять ЛС. Я могу добавить текст ровно туда, куда нужно, разместив его в assets/javascripts/discourse/templates/connectors/user-summary-stat/my-clever-name.hbs. (Это вызвало бурю восторга!).

Я вижу, что в файле https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/templates/user/messages.hbs#L3 используется:

    {{#if showNewPM}}

Я бы хотел использовать это в my-clever-name.hbs, но эта переменная там не определена.

Думаю, мне, возможно, нужно создать файл my-clever-name.js.es6 в той же директории, что и мой hbs-файл, и включить туда что-то… или добавить код, который определит эту переменную, чтобы я мог к ней обратиться. Я несколько раз перечитал руководство для разработчиков, а также пытался скопировать код из некоторых плагинов, которые, кажется, делают то же самое, но так и не понял, как именно это сделать.

Привет, Джей,

Я слышал, что люди говорят: «EmberJS — это язык сам по себе»!

Вам нужно использовать вычисляемое свойство:

Хотя синтаксис исходного кода Discourse немного отличается, как и импорты, лучше всего найти пример. Вот фрагмент моего кода:

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

Значит, @discourseComputed("uploading") позволяет использовать переменную uploading в шаблоне hbs? Что-то вроде того, как в Ember:

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

Итак, я создам файл assets/javascripts/discourse/components/my-plugin.js.es6 и расширю . . . что-то . . .? Похоже, должен быть способ просто «включить» те же самые переменные, к которым имеет доступ другой шаблон, который я расширяю. О! Возможно, если я расширю «то самое», эти переменные станут доступны в моём компоненте?

Может, стоит отступить и потратить неделю на учебник по Ember?

Итак, здесь создаётся вычисляемое свойство с именем ‘fullName’, которое обновляется при изменении ‘firstName’ или ‘lastName’. Его значением становится результат возврата функции.

Спасибо за ваше терпение!

Кажется, я понял это, но не понимаю, как сделать значения, доступные в моём шаблоне.

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: "это текст в моём весёлом элементе",
    @discourseComputed("myvalue")
    someThing(myvalue) {
        return true;
    }
});

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

Кажется, я спрашиваю (возможно, это звучит бессмысленно), что можно написать в assets/javascripts/discourse/templates/connectors/user-profile-controls/add-link-to-subscription.hbs, чтобы иметь доступ к myFunThing или myvalue?

Шаблон, соответствующий вашему компоненту js, может ссылаться на ваше вычисляемое свойство, просто включив его в двойные фигурные скобки:

{{fullName}}

Вышеприведённый код находится в файле assets/javascript/discourse/components/user-private-messages.js.es6.

Я хочу иметь возможность использовать {{myFunThing}} и/или {{myvalue}} в файле assets/javascripts/discourse/templates/connectors/user-profile-controls/add-link-to-subscription.hbs, но они не определены.

Я полагаю, что один из этих файлов находится не в том месте (я вижу, что другой текст в вышеуказанном файле hbs отображается на странице /u/username/summary, просто без myFunThing), либо я импортирую не тот класс и/или расширяю не тот компонент.

Извини, Джей, я немного занят, но вот что ты можешь сделать: просто подключи свой компонент в файле hbs внутри connector.hbs, например:

{{my-component}}

(добавь аргументы по необходимости)

Затем он будет искать my-component.hbs в папках templates/components и /components.

В качестве альтернативы ты должен иметь возможность задать свойство в файле JS внутри директории connector, но для моего стиля я предпочитаю первый подход.

Я знаю, что это сообщение годичной давности, но удалось ли вам, @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