2012-03-27 11 views
5

backbone.js में, मुझे लगता है कि change और allModel पर ईवेंट set मॉडल के गुणों को इसके मौजूदा विशेषताओं में नहीं तोड़ते हैं।backbone.js: मॉडल इवेंट जो मौजूदा मानों के गुणों को सेट करते समय आग लगती है?

उदाहरण के लिए, अगर मैं निम्न इवेंट की स्थापना:

ActiveUser.bind('change', this.displayActiveUser, this); 
ActiveUser.bind('all', this.displayActiveUserAll, this); 

और फिर मैं मैन्युअल रूप से रिक्त स्ट्रिंग पर ActiveUser का मान सेट:

ActiveUser.set({ text : '' }); 

घटनाओं आग तभी यदि ActiveUser.text पहले से ही खाली स्ट्रिंग पर सेट नहीं है।

यह उचित व्यवहार है। हालांकि, क्या कोई ऐसी घटना है जिसका मैं उपयोग कर सकता हूं जो कि मूल्य निर्धारित होने पर भी मौजूदा मूल्य है?

अद्यतन: मुझे आधिकारिक Backbone.js list of events में कुछ भी दिखाई नहीं देता है। हम्म।

+2

आप हमेशा 'ActiveUser.trigger (' change ')' – abraham

+0

धन्यवाद मैन्युअल रूप से चला सकते हैं - यही वह है जो मैं करूँगा! – Richard

+0

मैंने अपनी टिप्पणी को एक उत्तर के रूप में जोड़ा। – abraham

उत्तर

8

तुम हमेशा ActiveUser.trigger('change'); साथ मैन्युअल रूप से परिवर्तन घटना को गति प्रदान कर सकते हैं।

1

ऐसा लगता है कि आपको बैकबोन की आवश्यकता है। मॉडल उपclass जो आपके किसी भी मॉडल वर्ग का अभिभावक वर्ग है जो इस व्यवहार को चाहता है। इन पंक्तियों के साथ set विधि को ओवरराइड करें। परिवर्तनों पर केवल घटनाओं को आग लगाने के लिए तर्क Backbone.Model.set में कोड किया गया है जो आसानी से एक नया विकल्प जोड़ने का समर्थन नहीं करता है।

(... अंश ...)

set: function(key, value, options) { 
    //Handle both "key", value and {key: value} -style arguments. 
    if (_.isObject(key) || key == null) { 
     options = value; 
    } 
    this.change(options); //This fires the event 
    Backbone.Model.prototype.set.apply(this, arguments);//Trigger normal behavior as well 
3

उत्प्रेरक परिवर्तन घटना मैन्युअल रूप अब्राहम ने कहा

MyModel.trigger('change') 

तो इसके संभावित मैन्युअल परिवर्तन घटना को गति प्रदान करने, लेकिन यह कुछ मामलों में अच्छी तरह से काम नहीं करेगा। उस मामले पर विचार करें जब आपकी रेंडर विधि मॉडल से गुण लेती है और आपका मॉडल प्रारंभ में खाली होता है, इसलिए यदि आपका कोड मॉडल पर कुछ सेट करता है और उस पंक्ति के ठीक बाद आप MyView.render() या MyModel.trigger('change') कहते हैं तो आपकी रेंडर विधि तेज हो सकती है और यह भी नहीं लेती नए सेट गुण।

त्वरित hacky विकल्प हर बार जब आप कुछ तय किया जा सकता है, साथ यादृच्छिक संख्या पैदा करते हैं और यह मॉडल को पारित:

MyModel.set({myProperty:something,rand:Math.random()}); 

या

MyModel.set({myProperty:something,t:(new Date).getTime()}); 

तो इस मामले में आपको लगता है कि मॉडल होगा यकीन कर रहे हैं हमेशा कुछ बदलावों के कारण आग परिवर्तन घटना होती है, लेकिन यह हैकी है और यदि आपके पास बहुत कुछ चल रहा है तो आपका ऐप यादृच्छिक संख्या कैलक्यूलेटर बन जाएगा।

वैकल्पिक रूप से पीटर लियोन विधि के साथ जाएं।

+0

हैकी विकल्प निश्चित रूप से काम करता है, लेकिन सीधे आगे ट्रिगर उस से कहीं अधिक स्पष्ट है। –

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