Sono molto bravo nell’amministrazione di sistema. Non sono male nel fare cose con Rails. Con JavaScript, Ember e CSS, invece, sono un cavernicolo.
In un plugin che modifica chi può inviare messaggi privati (PM), sto cercando di aggiungere un pulsante alla pagina del profilo quando l’utente non ha il permesso di inviare un PM. Posso aggiungere il testo esattamente dove voglio inserendo il contenuto in assets/javascripts/discourse/templates/connectors/user-summary-stat/my-clever-name.hbs. (C’è stata molta gioia!).
Vorrei usare quella variabile in my-clever-name.hbs, ma non è definita.
Penso che forse debba creare un file my-clever-name.js.es6 nella stessa directory del mio file hbs e includere… qualcosa, e/o aggiungere del codice che definisca quella variabile in modo da poterla accedere. Ho riletto più volte la guida per gli sviluppatori e ho anche cercato di imitare il codice di alcuni plugin che sembrano fare la stessa cosa, ma non riesco a capire esattamente come fare.
Ho sentito dire che EmberJS è “un linguaggio a sé stante”!
Ciò di cui hai bisogno è una proprietà calcolata:
Anche se la sintassi del codice sorgente di Discourse è leggermente diversa, così come le importazioni, è meglio cercare un esempio. Ecco un estratto del mio codice:
Quindi creerò assets/javascripts/discourse/components/my-plugin.js.es6 ed estenderò… qualcosa…? Sembra che ci dovrebbe essere un modo per “attivare” semplicemente le stesse variabili a cui ha accesso l’altro template che sto estendendo. OH! Forse estendendo “quella cosa” nel mio componente quelle variabili diventerebbero disponibili per me?
Dovrei rimandare e fare un passo indietro, dedicando una settimana al tutorial di Ember?
Quindi si sta impostando una proprietà calcolata chiamata ‘fullName’, che viene aggiornata ogni volta che ‘firstName’ o ‘lastName’ cambiano. Il valore restituito diventa il valore della proprietà.
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);
});
Credo che quello che sto chiedendo, il che potrebbe non avere senso, è cosa posso inserire in assets/javascripts/discoures/templates/connectors/user-profile-controls/add-link-to-subscription.hbs per poter accedere a myFunThing o myvalue?
Il template corrispondente al tuo componente JS può fare riferimento alla tua proprietà calcolata semplicemente includendola tra doppie parentesi graffe:
Il codice sopra si trova in assets/javascript/discourse/components/user-private-messages.js.es6.
Vorrei poter utilizzare {{myFunThing}} e/o {{myvalue}} in assets/javascripts/discourse/templates/connectors/user-profile-controls/add-link-to-subscription.hbs, ma risultano non definiti.
Credo che uno di questi file si trovi nella posizione sbagliata (noto che altri testi nel file hbs sopra vengono visualizzati su /u/username/summary, ma senza myFunThing), oppure che stia importando la classe sbagliata e/o stia estendendo il componente errato.
Mi dispiace Jay, sono un po’ impegnato, ma quello che puoi fare è semplicemente collegare il tuo componente nel file hbs all’interno del connector hbs, ad esempio:
{{my-component}}
(aggiungi gli argomenti se necessario)
In questo modo il sistema cercherà my-component.hbs in templates/components e /components.
In alternativa, dovresti essere in grado di impostare la proprietà nel file js all’interno della directory del connector, ma per il mio stile preferisco il primo approccio.