2012-02-24 13 views
8

मुझे लगता है कि मैं जो करना चाहता हूं वह बहुत आसान है, मुझे नहीं पता कि यह कैसे करना है। मैं अपने स्वयं के कार्यक्रम को आग लगाना चाहता हूं जब मेरे मॉडल में से कोई एक ईवेंट ईवेंट हैंडलर को कुछ डेटा पास करने के उद्देश्य से परिवर्तन करता है (चाहे परिवर्तन मूल्य में वृद्धि या कमी हो)।एक बैकबोन मॉडल ओवरराइट करना इवेंट

मूल रूप से मैं अपने हैंडलर दृश्य

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

// ... 

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

पास नहीं कर रहे हैं? – tkone

+0

hmmm शायद मेरा प्रश्न स्पष्ट नहीं है, मैं जानना चाहता हूं कि मैं 'परिवर्तन: एटीआर' हैंडलर को डेटा कैसे पास कर सकता हूं, अभी जब उस घटना को रीढ़ की हड्डी से "स्वचालित रूप से" निकाल दिया जा रहा है, जब भी मैं अपने 'सेट()' पर कॉल करता हूं आदर्श। – Matthew

+0

आप किस डेटा को पास करना चाहते हैं? आपके पास पहले से ही मॉडल तक पहुंच होगी और आपको पता चलेगा कि कौन सा विशेषता बदल दी गई है। – tkone

उत्तर

12

ये रहा: आप मूल रूप से change:myvar के लिए सुन। जब कोई परिवर्तन होता है तो आप पुराने मान प्राप्त करने के लिए अपने मॉडल के previous() का उपयोग करते हैं। इस पर निर्भर करता है कि यह बढ़ी हुई है या आप उचित घटना को आग लगाना चाहते हैं। initialize() में दिखाए गए अनुसार आप इन घटनाओं को सुन सकते हैं।

(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);​ 

चल रहा है ऊपर होगा "वृद्धि" प्रिंट, "वृद्धि", अपने कंसोल "कमी"।

+0

यह एक बहुत अच्छा समाधान की तरह दिखता है। इसका परीक्षण करेंगे और वापस वापस आ जाएंगे ... – Matthew

+0

महान काम करता है, स्वीकृत – Matthew

+0

बहुत अच्छी तरह से काम करता है, सिर के लिए धन्यवाद। मेरे मामले में, मुझे उस दृश्य में घटना का पता लगाने की आवश्यकता थी जिसमें एक संलग्न मॉडल है। तो घटना 'परिवर्तन: attribute_name' तब भी ट्रिगर हो गया जब मॉडल को डीओएम इनपुट से मॉडल मान में परिवर्तन के अलावा दृश्य से जुड़ा हुआ हो। इसलिए मुझे यह जांचना पड़ा कि 'प्रारंभिक' विधि को देखते हुए ट्रिगर किए गए ईवेंट का पता लगाने से बचने के लिए 'this.model.get ('attribute_name')' null' है या नहीं। – codarrior

0

में ऐसा करना चाहते हैं क्या होगा यदि आप परिवर्तन घटना को सुनने के बाद अपने स्वयं के कस्टम ईवेंट को सक्रिय?

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

बस previousAttributes()

को देखो फिर आप तुलना कर सकते हैं:

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

आप का उपयोग अपने change ईवेंट हैंडलर में तो आप तैयार हैं कि अगर। कस्टम ट्रिगर या कोड का एक टन की आवश्यकता नहीं है।

संपादित

यह मेरा Backbone.Validators परियोजना से है और मैं कैसे सभी विशेषताओं जो मान्यता चरण के दौरान बदल दिया है की सूची प्राप्त:

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; 
}; 

क्योंकि यह _.has उपयोग कर रहा है यह अंडरस्कोर 1.3.1 की आवश्यकता है। यदि आप अपग्रेड नहीं कर सकते हैं तो यह बदलने के लिए एक आसान चीज़ है। आपके मामले में आप this.previousAttributes() और this.attributes

+0

यह वही दिखता है जो @ggozad के साथ आया था। मैंने उसे स्वीकार कर लिया क्योंकि मुझे 'this.on (' बदले: attr' 'और हैंडलर में एक कस्टम घटना को फायर करने का विचार पसंद आया। हालांकि आपकी मदद के लिए धन्यवाद :) – Matthew

+0

@ मैथ्यू यूप। यह करने का सबसे अच्छा तरीका है।इस के लिए विचार यह है कि आप विशेषताओं की तुलना करके इसे सामान्य रूप से कर सकते हैं जो आपको आवश्यकता होने पर पुन: उपयोग करना आसान बनाता है। प्रतिक्रिया के लिए धन्यवाद! – tkone

संबंधित मुद्दे