posso mancare completamente qualcosa qui, ma ho il seguente:Ottenere backbone.js per eseguire una funzione dopo aver creato una raccolta?
- un modello che racchiude in sé 'tutti' i dati (tutti JSON caricati da un URL)
- il modello ha uno (o più) collezioni quale è istanziare con i dati che riceve costruzione
- po 'di codice che ho voglia di correre sulla collezione quando viene inizializzato i dati e caricato
la mia domanda riguarda la collezione composta. Potrei farlo al di fuori dell'ambito della Collezione, ma preferirei incapsularlo (altrimenti qual è il punto di renderlo una 'classe' con un inizializzatore, ecc.).
ho pensato che avrei potuto mettere che il codice nella funzione
initialize()
, ma che corre prima che il modello è stato compilato, quindi non ho accesso ai modelli che compongono la collezione (this.models
è vuota).Poi ho pensato di poter associare a un evento, ma nessun evento viene attivato dopo l'inizializzazione. Lo sarebbero se caricassi la collezione con un
fetch
dal proprio endpoint, ma non lo sto facendo, sto inizializzando la raccolta da dati preesistenti.
La mia domanda: Come arrivare inizializzare il codice da eseguire sul Collezione subito dopo che è stato inizializzato con dati (vale a dire this.models
non è vuoto).
È possibile farlo senza dover inserire il codice "esterno"?
Ok ecco il codice demo, forse questo spiegherà meglio le cose.
var Everything = Backbone.Model.extend({
url: "/static/data/mydata.json",
parse: function(data)
{
this.set("things", new Things(data.things, {controller: this}));
}
});
var Thing = Backbone.Model.extend({
});
var Things = Backbone.Collection.extend({
model: Thing,
initialize: function(data, options)
{
// HERE I want access to this.models.
// Unfortunately it has not yet been populated.
console.log("initialize");
console.log(this.models);
// result: []
// And this event never gets triggered either!
this.on("all", function(eventType)
{
console.log("Some kind of event happend!", eventType);
});
}
});
var everything = new Everything();
everything.fetch();
// Some manual poking to prove that the demo code above works:
// Run after everything has happened, to prove collection does get created with data
setTimeout(function(){console.log("outside data", everything.get("things").models);}, 1000);
// This has the expected result, prints a load of models.
// Prove that the event hander works.
setTimeout(function(){console.log("outside trigger", everything.get("things").trigger("change"));}, 1000);
// This triggers the event callback.
Speravo di eseguire la costruzione della raccolta in modo sincrono (quindi, ad esempio, potrebbe essere utilizzato nella riga successiva di "Everything.parse"). Ovviamente differire non lo farebbe. Potrei dover spostare la logica fuori dalla collezione. Forse una richiesta di modifica a Backbone.js ... – Joe
L'utilizzo di "differimento" risulta ideale se si desidera installare EventListener in webCGM. Il diagramma webCGM viene caricato come oggetto indipendente e inizia la vita come immagine stupida. Devi dirlo esplicitamente per iniziare a inviarti gli eventi, che puoi poi reindirizzare all'infrastruttura backbone. Sospetto che la stessa tecnica possa essere utilizzata per interagire con altri plug-in (SVG/PDF ecc.), Molti dei quali non funzionano bene nel broswer. –