2012-02-24 5 views
8

Yapmak istediğim şey oldukça basit, nasıl yapacağımı bilmiyorum. Modellerimden biri, bazı verileri olay işleyicisine iletmek amacıyla değişiklikler yüklediğinde (değişiklikteki artış veya artışta bir azalma mıydı) kendi olayımı tetiklemek isterim.Omurga Modellerinin Üzerine Yazma Olayı Değiştir

Temelde benim işleyicisi görünüm

handler: function(increased) { 
    if(increased) { 
     alert("the value increased") 
    } 
    else { 
     alert("the value decreased") 
    } 
} 

// ... 

this.model.on("change:attr", this.handler, this); 
+1

'u geçemiyorsunuz. – tkone

+0

hmmm belki benim sorum açık değil, ben veriyorum nasıl değiştirmek için "change: attr" işleyicisine veri, bilmek istiyorum o olay şu anda "automagically" omurga tarafından, ne zaman "set"() ' modeli. – Matthew

+0

Hangi verilerden geçmek istersiniz? Modele zaten erişebileceksiniz ve hangi özelliğin değiştirildiğini öğreneceksiniz. – tkone

cevap

12

İşte burada: Temel olarak change:myvar'u dinlersiniz. Bir değişiklik olduğunda, eski değeri almak için modelinizin previous() modelini kullanın. Arttırılmış veya azaltılmış olmasına bağlı olarak uygun olayı ateşlersiniz. Bu olayları initialize()'da gösterildiği gibi dinleyebilirsiniz.

(function($){ 

    window.MyModel = Backbone.Model.extend({ 

     initialize: function() { 
      this.on('change:myvar', this.onMyVarChange); 
      this.on('increased:myvar', function() {     
       console.log('Increased');     
      }); 
      this.on('decreased:myvar', function() {     
       console.log('Decreased');     
      }); 
     }, 

     onMyVarChange: function() { 
      if (this.get('myvar') > this.previous('myvar')) { 
       this.trigger('increased:myvar'); 
      } else { 
       this.trigger('decreased:myvar'); 
      } 
     }    
    }); 

    window.mymodel = new MyModel({myvar: 1}); 
    mymodel.set({myvar: 2}); 
    mymodel.set({myvar: 3}); 
    mymodel.set({myvar: 1}); 

})(jQuery);​ 

yukarıdaki konsola "Azalmış", "Artan", "Artan" yazdırılırken Running.

+0

Bu çok hoş bir çözüm gibi görünüyor. Onu test edecek ve geri dönecek ... – Matthew

+0

harika çalışıyor, kabul edilen – Matthew

+0

Oldukça iyi çalışıyor, başınız için teşekkürler. Benim durumumda, olayı ekli bir modele sahip olan görünümde tespit etmem gerekiyordu. Bu nedenle, modelin değeri DOM girişinden değiştiğinde, modele eklendiğinde bile 'event: changeute_name' olayı tetiklenir. Bu yüzden, 'initialize' yöntemini görüntülemede tetiklenen olayı tespit etmekten kaçınmak için this.model.get ('attribute_name')' null 'olup olmadığını kontrol etmeliydim. – codarrior

0

bunu yapmak istiyorum ne değişim olayı dinledikten sonra kendi özel olay yangın olur?

handler: function(increased) { 
    this.model.trigger('my-custom-event', stuff, you, want); 
}, 
myHandler: function(stuff, you, want){ 
    // Do it... 
} 
// ... 
this.model.on("change:attr", this.handler, this); 
this.model.on('my-custom-event, this.myHandler, this); 
2

Hemen Sonra karşılaştırabilirsiniz previousAttributes()

bakmak:

If(this.get(attr) > this.previousAttributes()[attr]){ 
    console.log('bigger'); 
} else { 
    console.log('smaller'); 
} 

Eğer change olay işleyicisi Tamamen hazır olduğunu kullanın. Özel bir tetiklemeye veya kod tonuna gerek yok.

DÜZENLEME

Bu benim Backbone.Validators projeden ve ben doğrulama adımı sırasında değişmiş bütün niteliklerin listesini elde nasıl: Bu _.has kullanıyor çünkü

var get_changed_attributes = function(previous, current){ 
    var changedAttributes = []; 
    _(current).each(function(val, key){ 
     if(!_(previous).has(key)){ 
      changedAttributes.push(key); 
     } else if (!_.isEqual(val, previous[key])){ 
      changedAttributes.push(key); 
     } 
    }); 
    return changedAttributes; 
}; 

Bu alt çizgi 1.3.1 gerektirir. Eğer yükseltemezseniz, bunun yerini değiştirmek kolay bir şeydir. Sizin durumunuzda, this.previousAttributes() ve this.attributes

+0

bu, @ggozad'ın neye benzediğine benziyor. Onu kabul ettim çünkü bu '(' değişti: attr '') dinleyiciyi dinleme ve işleyicide özel bir etkinlik yapma fikrini sevdim. Yardımınız için teşekkürler :) – Matthew

+0

@matthew Yup. Bunu yapmanın en iyi yolu budur.Bunun için bir fikir, ihtiyacınız varsa yeniden kullanımını kolaylaştıran özellikleri karşılaştırarak bunu genel olarak yapabileceğinizdir. Geri dönüşünüz için teşekkür ederiz! – tkone