7

Desidero che un evento di modifica venga attivato ogni volta che modifico qualsiasi proprietà del modello, ad eccezione di una. È possibile? Oltre a fare:Backbone - È possibile associare un evento di modifica a un modello, ad eccezione di una proprietà?

model.bind('change:prop1', func); 
model.bind('change:prop2', func); 
model.bind('change:prop3', func); 
etc.... 

Oppure, in alternativa, c'è un modo per scoprire quali proprietà ha innescato il cambiamento dall'interno del gestore di eventi?

Grazie

risposta

11

Si potrebbe utilizzare model.bind('change',function() {/*...*/}) e nella funzione d'uso hasChanged per controllare gli attributi: if(model.hasChanged('propIWantToExclude')) return;

+0

Qualcuno può rispondere alla prima parte della domanda? vale a dire. Come licenziare un evento di cambiamento ogni volta che cambio una proprietà del modello, ad eccezione di una? –

+0

^basta usare il "cambiamento" come nella risposta ... anche se vedo che è stato modificato, quindi probabilmente hai chiesto prima della modifica :) – gthmb

0

risponde alla richiesta di David Tuite per rispondere alla prima parte della domanda, è possibile impostare una funzione per rispondere all'evento "modificato" e quindi attivare un evento personalizzato se la proprietà che si desidera ignorare non è stata modificata.

Questa logica attiverà l'evento personalizzato: 'somePropertyOtherThanThePropIWantToExcludeChanged' se la proprietà non è stata modificata. Se più proprietà sono state modificate, tra cui quello che si desidera ignorare, allora l'evento personalizzato non vorrei fuoco: risposta

model.bind('change', function(){ 
    if(!model.hasChanged('propIWantToExclude')){ 
     model.trigger('somePropertyOtherThanThePropIWantToExcludeChanged'); 
    } 
}); 
3

di Justin sopra ritornerà quando 'propIWantToExclude' e alcuni altri attributi sono cambiati insieme. Probabilmente non vuoi farlo, quindi dovresti anche considerare le dimensioni di model.changedAttributes:

if(model.changedAttributes.length == 1 && model.hasChanged('attrIWantToExclude')) { 
    return; 
} 
+0

Dovrebbe essere: "model.hasChanged ('attrIWantToExclude') && Object.keys (model.changedAttributes()). length == 1 ". Oppure "Object.keys (model.changed) .length == 1 && ...". changedAttributes è una funzione e restituisce un hash di oggetti modificati o false se non ce ne sono. hash.length non funziona, quindi hai bisogno di qualcosa del genere: Object.keys (hash) .length. false può essere restituito dagli errori changedAttributes e Object.keys (false), quindi è necessario un test hasChanged prima del riferimento Object.keys su changedAttributes (o altro riferimento model.changed interno). - http://backbonejs.org/#Model-changedAttributes –

Problemi correlati