2011-06-02 7 views
6

उपयोगकर्ता कार्रवाई के आधार पर एक ईवेंट ट्रिगर करने के बजाय आप किसी ऑब्जेक्ट में बदलावों को सुन सकते हैं और फिर प्रतिक्रिया दे सकते हैं?क्या किसी ऑब्जेक्ट में बदलावों की निगरानी करने का कोई तरीका है?

+3

http://stackoverflow.com/questions/1029241/javascript-object-watch-for-all-browsers –

उत्तर

7

ठीक है, जिस डोमेन के साथ आप काम कर रहे हैं उसके आधार पर, आप backbone.js का उपयोग कर सकते हैं - इसमें एक "मॉडल" ऑब्जेक्ट है जिसे आप विस्तारित कर सकते हैं और कॉलबैक से कनेक्ट हो सकते हैं जो मॉडल बदलते समय स्वचालित रूप से ईवेंट द्वारा ट्रिगर किए जाते हैं - वह है, आप मॉडल पर एक फ़ील्ड सेट करते हैं, और यह स्वचालित रूप से एक ऐसी घटना को आग लगा देगा जिसे आप सुन सकते हैं। आपको अपने मॉडल को विस्तारित करने के लिए अपने मॉडल को परिभाषित करना होगा, और गुणों को सीधे सेट करने के बजाय एक सेटर फ़ंक्शन को कॉल करना होगा, लेकिन यह बहुत उपयोगी है, मैं इसकी अनुशंसा करता हूं।

बस स्पष्टता के लिए, को पर मॉडल से निकाल दिया गया है, इसलिए यदि आप प्रोग्रामेटिक रूप से या कंसोल में विशेषता का मान सेट करते हैं तो भी इसे निकाल दिया जाता है।

+0

धन्यवाद मैट, रीढ़ की हड्डी एक महान विकल्प की तरह दिखती है। – fancy

+0

एक विकल्प होगा [spine.js] (http://maccman.github.com/spine/) – Raynos

0

आप प्रॉपर्टी चेंज पर गेटर्स और सेटर्स ro प्रतिक्रिया का उपयोग कर सकते हैं। जॉन रेजिग ने उनके बारे में article लिखा है।

5

मैंने ऐसा कुछ लिखा है।

https://github.com/jmoyers/mettle

person.on('name.change', function(val){ 
    // 'a new name was committed: Yolanda' 
    console.log('a new name was committed: ', val) 
}); 

person.name = 'Yolanda'; 

https://github.com/jmoyers/mettle/blob/master/src/model.coffee

यह सब स्रोत के माध्यम से खुदाई करने के लिए एक छोटे से ज्यादा हो सकता है। यहां एक स्पष्टीकरण दिया गया है:

मेरी परियोजना के लिए कुंजी दो अवधारणाएं हैं। एक ट्रैक को गुणों का एक सेट रखना और परिभाषित करने वाले प्रत्येक के लिए गेटर्स और सेट्स बनाना है, और परिभाषित करें। दूसरा, आपके सेटर में इन संपत्ति परिवर्तनों के आधार पर EventEmitter और प्रसारण ईवेंट 'subclass' है।

ट्रैक दिखाता है कि मैंने चाबियों के एक सेट के लिए गेटर/सेटटर कैसे स्थापित किया।

Model.prototype.track = function(keys) { 
    _.each(keys, __bind(function(key) { 
     this.tracked.push(key); 
     this.__defineGetter__(key, __bind(function() { 
     return this.get(key); 
     }, this)); 
     return this.__defineSetter__(key, __bind(function(val) { 
     return this.set(key, val); 
     }, this)); 
    }, this)); 
    return this; 
    }; 

यहाँ कैसे एक 'जादू' सेटर के आधार पर प्रसारित करने के लिए की एक उदाहरण है:

Model.prototype.set = function(key, val) { 
    this.attribs[key] = val; 
    this.emit('change', this.attribs); 
    type = key + '.change'; 
    this.emit(type, val); 
    }; 

इस सरल उदाहरण से, के बाद से मैं मिश्रण में 'विशेषता मिडलवेयर' की शुरुआत की है, लेकिन यह कैसे पता चलता आप संपत्ति परिवर्तन के आधार पर एक परिवर्तन घटना उत्सर्जित कर सकते हैं।

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

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