Sto aggiungendo un componente a before-topic-list-body. Ho bisogno che ottenga alcuni dati dalla categoria o dall’argomento (e aggiungerò i dati che voglio a qualsiasi serializzatore abbia più senso).
Ho passato un paio d’ore a questo e ho deciso che sono perso e c’è una buona probabilità che questo sia un problema da 2-5 minuti per darmi un suggerimento di cui ho bisogno.
Ricordo vagamente di aver pensato o sentito qualcosa a riguardo prima, ma sono bloccato.
Grazie, @Lilly! Non è una cattiva idea, ma temevo che currentUser si applicasse all’intera pagina e non solo a dove viene inserito il componente, e penso di aver ragione. Per vedere cosa era disponibile in quel modo, ho cercato nei plugin ufficiali e ho ottenuto questo elenco di servizi (se fossi intelligente saprei come trovarli nel codice sorgente di Discourse, ma non lo sono):
Quindi sono in grado di usare quella parentView e _parentView per risalire all’argomento! Questa è la magia che sto cercando, (che penso risolverà anche un altro problema su un altro progetto). Ora tutto ciò che devo fare è inserire le cose nel controller dell’argomento, che spero siano tutte cose che so (almeno per la maggior parte) fare!
Questo ha stampato un messaggio di deprecazione nella console? Dovrebbe averlo fatto, perché rimuoveremo l’accesso a parentView da PluginOutlet a breve. Infatti, è così sconsigliato che dovrebbe causare la visualizzazione di un banner di avviso agli amministratori nell’interfaccia utente
Se non hai visto avvisi, faccelo sapere!
(parentView fa parte del sistema di componenti classico di Ember, da cui ci stiamo allontanando)
Se desideri accedere alle informazioni dall’alto nell’albero, queste devono essere passate come argomento a Plugin Outlet, oppure devi utilizzare uno dei servizi disponibili (come currentUser o router).
Ah, capisco cosa è successo. Stai usando ._parentView, non .parentView. La versione con underscore ti permette di aggirare il messaggio di deprecazione. Ma comunque, smetterà di funzionare entro le prossime settimane.
Questa PR impedisce questo tipo di soluzione alternativa, quindi sia .parentView che ._parentView solleveranno la deprecazione:
<td class="rating-one">
<span class="rating-title">{{this.ratingName}}</span>
Questo è l'argomento {{this.topic.id}}
Questa è la categoria {{this.topic.category.title}} (id categoria: {{this.topic.category_id}})
{{log "rating this" this}}
{{log "scale value" this.scaleValue}}
{{log "rating value" this.ratingValue}}
{{log "category" this.topic.category_id}}
<form>
{{!-- {{this.ratingLow}} --}}
{{#each this.ratingOptions as |option|}}
<input type="radio" name="rating" value={{option.value}} checked={{if (eq option.value this.ratingValue) "checked"}}> <span class="rotated-label">{{option.label}}</span>
{{/each}}
{{!-- {{this.ratingHigh}} --}}
</form>
</td>
Ah. OK. Quindi posso usare router per accedere all’argomento o alla categoria? Quello che (penso di) dover fare è inserire quelle ratingOptions nel serializzatore dell’argomento o della categoria in modo da poter aggiungere queste valutazioni multiple all’elenco degli argomenti in modo che queste cose possano essere valutate senza entrare negli argomenti (presumibilmente le persone avranno già familiarità con loro, quindi non avranno bisogno di entrare nell’argomento per sapere per cosa stanno votando).
Quindi outletArgs significa che ora è nel this della cosa? (Questo è quello che sembra - pensavo che avrei dovuto cercare in args in qualche modo…)
Quindi nel mio hbs di connessione, posso accedere a this.topic e poi posso chiamare il mio componente in questo modo:
<RatingOne @name="one" @topic={{this.topic}}/>
E poi nell’hbs per il componente RatingOne (un giorno sarà rinominato semplicemente rating dato che ho capito come passarci le cose) posso
Questo è il topic {{this.topic.id}} {{this.topic.title}}
Questo è l'id della categoria: {{this.topic.category_id}})
e ottenere le cose del topic!
E ora vedo il topic, ora posso andare ad aggiungere i miei argomenti al serializzatore del topic, giusto? (Potrebbe essere meglio passarlo solo alla categoria… o forse passerò solo un valore “doTheThing” nel serializzatore e otterrò le cose effettive da SiteSettings, dato che penso che vogliano questo a livello di sito e non di categoria).
A meno che non mi sia imbattuto in qualcos’altro di deprecato, sembra che tu l’abbia fatto. Grazie un milione.
Questo è correlato a "come faccio funzionare le cose in glimmer, quindi lo tengo qui.
Devo chiamare questo codice dopo che ogni argomento è stato renderizzato per riordinare gli elementi <td>. Ho usato above-topic-item, che mette le valutazioni prima del titolo dell’argomento. Questo hack selvaggio riordina gli elementi <td> con l’aiuto di un po’ di javascript.
// document.addEventListener("DOMContentLoaded", function() {
// const table = document.querySelector('table.topic-list.ember-view');
// const rows = table.getElementsByTagName('tr');
// // todo: questo deve essere chiamato al caricamento della pagina
// for (let row of rows) {
// const cells = Array.from(row.getElementsByTagName('td'));
// cells.sort((a, b) => {
// const orderA = parseInt(window.getComputedStyle(a).order, 10);
// const orderB = parseInt(window.getComputedStyle(b).order, 10);
// return orderA - orderB;
// });
// for (let cell of cells) {
// row.appendChild(cell);
// }
// }
// });
Penso che debba solo chiamare una afterRender o qualcos’altro invece della cosa a livello di documento che ho. Forse il router?"