2016-06-30 17 views
0

Nehmen wir an, ich möchte zwei Event-Listener haben, eine für myAttribute -Eigenschaft und eine weitere für den Rest der Eigenschaften.Bind model change event nur bestimmten Eigenschaften

dieses Problem zu lösen, kam ich mit dieser Lösung:

var Model = Backbone.Model.extend({ 

    defaults:function(){ 
     return { 
        myAttribute:'', 
        secondAttribute:'', 
        thirdAttribute:'', 
        only:'myAttribute' 
     }; 
    }, 
    initialize:function(){ 

     this.listenTo(this,'change',this.listenUnlessOnly); 
     this.listenTo(this,'change:'+this.get('only'),this.listenOnly); 

    }, 
    listenUnlessOnly:function(){ 

     // make sure that attributeName doesn't belong to the list 
     // of updated attributes 

     if(_.keys(this.changedAttributes()).indexOf(this.get('only')) === -1)    { 
      alert('Another attribute changed'); 
     }else{ 
      // the other attribute changed so do nothing     
     }      
    }, 
    listenOnly:function(){    
     alert('Yoli myAttribute changed :) !!!');     
    } 
}); 

var m = new Model(); 
m.set('username','hi'); // Another attribute changed 
m.set('myAttribute','something'); // 'Yoli myAttribute changed :) !!!' 

Here is the jsFiddle example.

Wo lese ich zwei Ereignis-Listenern eine für die benutzerdefinierte Eigenschaft (MyAttribute) und eine andere für den Rest der Eigenschaften registriert, und in der zweiten Eventlistener bin Überprüfung i, wenn die aktualisierte Eigenschaft nicht myAttribute feuert 2 Ereignis zu vermeiden.

Gibt es eine Standardlösung für dieses Szenario? etwas wie folgt aus:

this.listenTo(this,'change!myAttribute',this.listenUnlessOnly); 
this.listenTo(this,'change:'+this.get('only'),this.listenOnly); 

Jeder Vorschlag würde geschätzt.

+0

Also, was passieren soll, wenn ein Bündel von Attributen zu einer Zeit, einschließlich 'myAttribute' geändert werden? –

+0

@TJ eine gute Frage, gut in diesem Fall werden die anderen Attribute von dem anderen Ereignis-Listener behandelt und '' myAttribute'' wird nur von seinem Event-Listener behandelt. – Ismail

Antwort

0

Ich glaube, Sie nur einen Zuhörer für alle Fälle zu schaffen, haben

this.listenTo(this,'change',function(){ 
    var obj = this.changedAttributes(); 
    if(obj['myAttribute']){ 
    this.listenOnly(); 
    delete obj.myAttribute; 
    }else if(_.keys(obj).length >=1){ 
    this.listenUnlessOnly(); 
    } 
}.bind(this)) 
Verwandte Themen