Modifica: riclassificato come bug.
Riproduzione completa qui sotto.
Sto usando api.modifyClass in un componente tema.
Sulla maggior parte delle pagine funziona bene, ma in alcuni argomenti la proprietà non viene aggiunta al modello utente quando la pagina viene ricaricata. Non riesco a capire perché funzioni sulla maggior parte degli argomenti, ma non su alcuni, o cosa abbiano in comune gli argomenti in cui non funziona. Qualcuno capisce cosa sto sbagliando qui?
TL;DR Aggiungere api.container.lookup per il modello, sotto modifyClass, aggira questo problema.
È richiesto nelle versioni successive, ho effettivamente inviato delle PR per un paio di temi ieri per aggiungere questo. Potrei finalmente diventare uno sviluppatore di plugin/temi.
Grazie Jay! Ha effettivamente fatto la differenza sulla mia istanza di test.
Ma sfortunatamente non è una soluzione universale, il problema è ancora lì
Sì, il pluginId è lì per evitare che le modifiche vengano applicate due volte, credo. La sua mancanza non dovrebbe spiegare perché non è stato eseguito una volta?
Accidenti. Proprio quando pensavo di sapere qualcosa.
Pensavo che forse se qualcos’altro stesse modificando la classe, allora potrebbe esserci una race condition per vedere quale dei due lo facesse. Ma JavaScript è ancora per lo più un mistero per me.
Non sono sicuro se queste cose siano semanticamente identiche…
… teoricamente entrambe dovrebbero essere valutate quando il browser si aggiorna, dopodiché una race condition dovrebbe essere irrilevante alla transizione di rotta poiché la modifica dovrebbe essere già stata applicata…
Ok, ho visto una notifica da un post utile che apparentemente è stato rimosso nel frattempo.
Il suggerimento non ha funzionato ma conteneva un indizio che mi ha aiutato a risolvere questo problema.
Aggiungere il seguente snippet sotto il codice non funzionante ha risolto in modo coerente i problemi che stavo riscontrando. L’ho testato su più forum indipendenti, sia su versioni stabili che su test-passati. Penso che questo dovrebbe essere riclassificato come Bug …
Ho aggiunto un console.log nel codice dell’API del plugin app/assets/javascripts/discourse/app/lib/plugin-api.js in modo che registri ogni volta che modifyClass viene chiamato.
Ho rimosso tutti i plugin esterni per assicurarmi che non ci fosse un conflitto da qualche parte.
Riproduzione:
crea un forum vuoto su stable (quindi senza Ember CLI). Questo non funziona nemmeno su tests-passed (senza Ember CLI). Non l’ho testato con Ember CLI.
aggiungi un componente tema con questo in Common - Head
la console mostra modifyClass called for model:user _application-08d9058ddd37ba80992f770509f4919ad0738a17f14fb85167b1dc1f32f8b56e.js:23490:16 Object { pluginId: "test-tc", testFunction: testFunction() }
inserisci Discourse.currentUser.testFunction() nella console
viene stampato “1”
#2 Fallimento
Vai a un argomento, ad esempio ‘Welcome to Discourse’ e ricarica la pagina
la console mostra gli stessi log di “modifyClass called”
inserisci Discourse.currentUser.testFunction() nella console
viene stampato Uncaught TypeError: Discourse.currentUser.testFunction is not a function
#3 Fallimento con avviso
Aggiungi una singola riga in cima al componente tema in modo che appaia così:
Ho appena migliorato il nostro avviso per questo tipo di situazione:
e ho anche scritto questa documentazione che spiega la causa e come risolverla:
Penso che questo dovrebbe risolvere tutte le preoccupazioni in questo argomento. In caso contrario, condividi del codice di esempio non funzionante e darò un’occhiata.