Ik heb problemen met het detecteren van wijzigingen in een Glimmer-component en zou wat begeleiding kunnen gebruiken. Wanneer ik eigenschappen op objecten binnen een @tracked array muteer, wordt de template niet opnieuw gerenderd.
Hmm, dat is vreemd. De array-toewijzingstruc werkt meestal.
Een alternatief dat ik heb gevonden, is om de objecten in de array te laten komen van een klasse met eigen bijgehouden eigenschappen. Iets als:
class CustomSidebarItem {
@tracked expanded = false;
constructor(id, label) {
this.id = id;
this.label = label;
}
}
export default class CustomSidebarComponent extends Component {
@tracked items = [
new CustomSidebarItem('home', 'Home'),
new CustomSidebarItem('my-posts', 'My Posts'),
...
];
// rest van je code
}
Het kan omslachtiger zijn dan het maken van een hoop platte objecten, maar ik heb gemerkt dat het gemakkelijker uit te breiden en te redeneren is, vooral als je iets moet doen als het doorgeven van de gegevens aan geneste componenten.
Bedankt voor uw input. Ik heb nog een vervolgvraag:
Zou het gebruik van een bibliotheek zoals Immer werken?
Zo ja, hoe moet ik Immer in Discourse opnemen?
Ik heb vermeldingen gezien van ‘kopieer het naar assets vanuit node_modules’, maar ik zou het liefst een manier hebben om dit via npm te doen, of zelfs een CDN-link in de header-tag.
You can use loadScript() to load JS, even if the URL provided is an external URL. Using external services like jsdelivr should work with this.
import loadScript from "discourse/lib/load-script";
...
loadScript(URL).then(() => {
// your code
})
Though I haven’t tested it extensively, a dynamic import should also work.
async function load() {
const {
default: myDefault,
foo,
bar,
} = await import(URL);
// rest of code
}
I should note that it is probably safer to save the NPM files directly into your code instead of relying on an external CDN, depending on how critical the JS is. Similarly, you may need to do a bit of bundling and preprocessing before being able to use it in the browser.
As for whether Immer will work with discourse, I don’t know.