2011-09-13 9 views
11

Utilizzando Backbone.js so che si consiglia vivamente di impostare la proprietà di un modello utilizzando il metodo set e NON modificando direttamente lo attributes internal hash.backbone.js set modello hash attributi interni direttamente

Tuttavia, oltre a non attivare automaticamente l'evento "modifica", quali altri "effetti collaterali" ci sono nel modificare direttamente l'hash interno?

Il problema che sto affrontando è che mentre il metodo set prende un oggetto letterale, devo assegnare il lato sinistro usando una variabile determinata in fase di esecuzione. Grazie.

myModel.set({ 
    myProperty : myValue; //myProperty is a variable, so this is invalid syntax 
}) 

//vs 

myModel.attributes[myProperty] = myValue; //myProperty is a variable that can be evaluated 

risposta

15

Beh, se si guarda al annotated source code, troverete che set fa un sacco.

Che cosa succede se è esteso Backbone.Model con una funzione che fa per voi:

Backbone.Model.prototype.setByName = function(key, value, options) { 
    var setter = {}; 
    setter[key] = value; 
    this.set(setter, options); 
}; 

Poi, si può solo fare quello che vuoi direttamente sul modello:

var model = new Backbone.Model(); 
model.setByName(myProperty, "bar"); 

che si sente mi piace una soluzione migliore.

Modifica

Come @ earl3s sottolineato, questo non è più necessario nelle versioni più recenti di Backbone. Oggi puoi chiamare semplicemente model.set(myProperty, "bar") e fa quello che vuoi.

+1

Penso che la soluzione sia brillante. Questa funzione dovrebbe essere unita a nuove versioni Backbone! Grazie anche per aver segnalato il codice sorgente annotato; hai ragione, avrei dovuto guardarlo in primo luogo. – fortuneRice

+0

bello! Ho scritto questo codice una dozzina di volte e non ho mai pensato di renderlo un metodo. :) btw: non c'è bisogno di usare _.extend per questo. 'Backbone.Model.prototype.setByName = function (...) {...}' fa la stessa cosa ... funzionalmente lo stesso. solo un modo diverso di farlo. –

+0

@Dickick Bailey: Divertente ... Ho pensato che "_extend" avesse delle capacità extra per estendere i prototipi ... no. È davvero per estendere qualsiasi oggetto con una serie di modifiche. Niente di pazzesco lì. Cambiando la mia risposta per riconoscerlo. Grazie. –

7

Nel annotated source code citato da Brian Genisio è possibile leggere le seguenti righe: "Gestire sia" chiave ", valore e {chiave: valore} argomenti stile". Quindi puoi semplicemente usare model.set (miaProprietà, "barra", opzioni). Forse hanno aggiunto questa funzione dopo il post di Brian Genisio .. non so.

+0

Questa è la soluzione corretta. La funzionalità esiste già nel metodo 'set'. – earl3s

Problemi correlati