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!).
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.
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:
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.
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 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.