Editar: Reclassificado como bug.
Reprodutível completo abaixo.
Estou usando api.modifyClass em um componente de tema.
Na maioria das páginas, isso está funcionando bem, mas em alguns tópicos a propriedade não é adicionada ao modelo do usuário quando a página é recarregada. Não consigo descobrir por que está funcionando na maioria dos tópicos, mas não está funcionando em alguns, ou o que os tópicos onde não está funcionando têm em comum. Alguém entende o que estou fazendo de errado aqui?
Resumindo: Adicionar api.container.lookup para o modelo, abaixo do modifyClass, contorna esse problema.
É obrigatório em versões posteriores, eu realmente enviei PRs para alguns temas ontem para adicionar isso. Talvez eu esteja me tornando um desenvolvedor de plugins/temas, finalmente.
Obrigado, Jay! Isso realmente fez uma diferença na minha instância de teste.
Mas, infelizmente, não é uma solução mágica para tudo, o problema ainda está lá
Sim, o pluginId está lá para evitar que modificações sejam aplicadas duas vezes, acredito. A falta dele não deveria explicar por que ele não foi executado uma vez?
Droga. Justo quando eu pensei que sabia alguma coisa.
Eu pensei que talvez se algo mais estivesse modificando a classe, poderia ser uma condição de corrida para ver qual delas o fez. Mas o JavaScript ainda é um mistério para mim.
Não tenho certeza se essas coisas são semanticamente idênticas…
… teoricamente, ambas devem ser avaliadas quando o navegador é atualizado, após o qual uma condição de corrida não deve ter mais importância na transição de rota, pois a modificação já deve ter sido aplicada…
Ok, vi uma notificação de uma postagem útil que aparentemente foi removida entretanto.
A sugestão não funcionou, mas continha uma pista que me ajudou a resolver isso.
Adicionar o seguinte trecho abaixo do código que não funciona resolveu consistentemente os problemas que eu estava tendo. Testei isso em vários fóruns independentes, tanto em estável quanto em testes-passados. Acho que isso deveria ser reclassificado como Bug …
Adicionei um console.log no código da API do plugin app/assets/javascripts/discourse/app/lib/plugin-api.js para que ele registre sempre que modifyClass for chamado.
Removi todos os plugins externos para garantir que não houvesse conflito.
Reprodução:
Crie um fórum vazio em stable (sem Ember CLI). Isso também não funciona em tests-passed (sem Ember CLI). Não testei com Ember CLI.
Adicione um componente de tema com o seguinte em Common - Head
O console mostra modifyClass called for model:user _application-08d9058ddd37ba80992f770509f4919ad0738a17f14fb85167b1dc1f32f8b56e.js:23490:16 Object { pluginId: "test-tc", testFunction: testFunction() }
Digite Discourse.currentUser.testFunction() no console
“1” é impresso
#2 Falhando
Vá para um tópico, por exemplo, ‘Welcome to Discourse’ e recarregue a página
O console mostra os mesmos logs de “modifyClass called”
Digite Discourse.currentUser.testFunction() no console
Uncaught TypeError: Discourse.currentUser.testFunction is not a function é impresso
#3 Falhando com aviso
Adicione uma única linha no topo do componente de tema para que ele fique assim: