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.
I believe when you track an array like described in OP youâre tracking the array reference and not changes to the individual objects within the array
Another way to handle it is using trackedObject, we use this in a handful of places throughout Discourse
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.