Acessando variáveis em um conector

Sou ótimo em administração de sistemas. Não sou ruim em fazer coisas no Rails. Com JavaScript, Ember e CSS, sou apenas um cavernícola.

Em um plugin que altera quem pode enviar mensagens privadas (PMs), estou tentando adicionar um botão na página do perfil quando o usuário não tem permissão para enviar uma PM. Posso adicionar texto exatamente onde quero, colocando o conteúdo em assets/javascripts/discourse/templates/connectors/user-summary-stat/my-clever-name.hbs. (Houve muita alegria!).

Vejo que https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/templates/user/messages.hbs#L3 usa

    {{#if showNewPM}}

Gostaria de usar isso em my-clever-name.hbs, mas essa variável não está definida.

Acho que talvez precise criar um arquivo my-clever-name.js.es6 no mesmo diretório que meu arquivo hbs e incluir… algo, e/ou adicionar algum código que defina essa variável para que eu possa acessá-la. Mas, mesmo relendo o guia do desenvolvedor algumas vezes e tentando imitar o código de alguns plugins que parecem estar fazendo a mesma coisa, não consigo ver exatamente como fazer isso.

Olá Jay,

Ouvi pessoas dizerem que o EmberJS é “uma linguagem em si mesmo”!

O que você precisa é de uma Propriedade Computada:

Embora a sintaxe do código-fonte do Discourse seja um pouco diferente, assim como as importações, o ideal é procurar um exemplo. Aqui está um trecho do meu código:

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

Então, @discourseComputed("uploading") faz com que uploading possa ser usado em um template hbs? Algo como


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

no Ember?

Então, vou criar assets/javascripts/discourse/components/my-plugin.js.es6 e estender… algo…? Parece que haveria uma maneira de simplesmente “ativar” as mesmas variáveis às quais o outro template que estou estendendo tem acesso. AH! Talvez estender “aquela coisa” no meu componente torne essas variáveis disponíveis para mim?

Devo desistir, dar um passo atrás e dedicar uma semana ao tutorial do Ember?

Então, isso está configurando uma propriedade computada chamada ‘fullName’, que é atualizada sempre que ‘firstName’ ou ‘lastName’ mudam. Ela se torna o valor do retorno.

Obrigado pela sua paciência!

Acho que entendi isso, mas o que não compreendo é como posso criar valores que eu possa acessar no meu 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);
});

Acho que o que estou perguntando, o que pode não fazer sentido, é o que posso colocar em assets/javascripts/discourse/templates/connectors/user-profile-controls/add-link-to-subscription.hbs para conseguir acessar myFunThing ou myvalue?

O modelo correspondente ao seu componente JS pode referenciar sua propriedade computada simplesmente incluindo-a entre chaves duplas:

{{fullName}}

O código acima está em assets/javascript/discourse/components/user-private-messages.js.es6.

E eu quero poder usar {{myFunThing}} e/ou {{myvalue}} em assets/javascripts/discourse/templates/connectors/user-profile-controls/add-link-to-subscription.hbs, mas eles estão indefinidos.

Acredito que um desses arquivos esteja no local errado (vejo que outros textos no arquivo hbs acima são renderizados em /u/username/summary, apenas sem myFunThing), ou que estou importando a classe errada e/ou estou estendendo o componente errado.

Desculpe, Jay, estou um pouco ocupado, mas o que você pode fazer é simplesmente conectar ao seu componente no arquivo HBS dentro do arquivo HBS do conector, por exemplo:

{{my-component}}

(adicione argumentos conforme necessário)

Em seguida, ele procurará por my-component.hbs em templates/components e /components.

Alternativamente, você deve ser capaz de definir a propriedade no arquivo JS dentro do diretório do conector, mas, para o meu estilo, prefiro a primeira abordagem.

Sei que isso é de um ano atrás, mas você conseguiu resolver isso, @pfaffman?

Espero que isso não seja para o mesmo projeto (inacabado), mas aqui está:

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

Isso chama:

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

E, eu acho:

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