2012-03-16 8 views
10

मैं हाल ही में हमारी अगली परियोजना के लिए उपयोग किए जाने वाले जावास्क्रिप्ट ढांचे का मूल्यांकन कर रहा हूं। मुझे वास्तव में एम्बर पसंद है। लेकिन हमारे आवेदन में, हमें डेटा परत से एक ईवेंटिंग तंत्र की आवश्यकता होगी ताकि नियंत्रक परत को सूचित किया जा सके कि कुछ बदल गया है। मैं एक एंबर में obersevers इस्तेमाल कर सकते हैं, उदाहरण के ,:क्या एम्बरजे प्रकाशित/ग्राहक घटना पैटर्न का समर्थन करते हैं?

person.addObserver('fullName', function() { 
    // deal with the change 
}); 

के लिए जानते हैं लेकिन मैं Backbone.Events कि आप सदस्यता या एक घटना प्रकाशित कर सकता में और अधिक पसंद है, विशेष रूप से:

var object = {}; 

_.extend(object, Backbone.Events); 

object.on("alert", function(msg) { 
    alert("Triggered " + msg); 
}); 

object.trigger("alert", "an event"); 

किसी एक विचार है क्या यह एम्बरजेएस में करने योग्य है?

आपको मेरे प्रश्न के बारे में कुछ पृष्ठभूमि देने के लिए, हमारा आवेदन एक वास्तविक समय का आवेदन है। तो समय-समय पर, बैकएंड रीस्टफुल सेवा क्लाइंट साइड (जावास्क्रिप्ट साइड) में एक ईवेंट को आग लग जाएगी। मैं एक डेटा लेयर रखना चाहता हूं जो बैकएंड रीस्टफुल सेवा तक पहुंच को समाहित करता है, लेकिन कैश भी रखता है। मुझे आशा है कि EmberJS.Data मुझे इसके साथ मदद कर सकता है (यह एक अलग सवाल है जिसे मैं जवाब ढूंढना चाहता हूं)। इसके साथ ही, जब भी बैकएंड रीस्टफुल सेवा से कोई परिवर्तन हुआ तो मैं भी कैश को अद्यतन करना चाहूंगा। एक बार कैश ऑब्जेक्ट अपडेट हो जाने पर, मैं नियंत्रक परत को अधिसूचित करना चाहता हूं। यह मूल रूप से जावास्क्रिप्ट पक्ष में कुछ घटना तंत्र की आवश्यकता क्यों है।

ध्यान दें कि कारण मैं पर्यवेक्षकों का उपयोग नहीं करना चाहता हूं कि कभी-कभी, एक घटना का मतलब यह हो सकता है कि मुझे कोई कार्रवाई करनी है, यानी एक संदेश लोड करना है, या संकेत है कि एक आवाज कॉल आ रही है। रीढ़ की हड्डी के रास्ते मेरे लिए अधिक natuarl लगता है।

धन्यवाद

उत्तर

11

2326580 प्रतिबद्ध के बाद से - जो उपलब्ध है के बाद से v0.9.6 - वहाँ है एक Ember.EventedMixin, http://jsfiddle.net/qJqzm/ देखते हैं।

var handler = Ember.Object.create({ 
    otherEvent: function() { 
     console.log(arguments); 
    } 
}); 

var myObject = Ember.Object.create(Ember.Evented, { 
    init: function() { 
     this._super(); 
     this.on('alert', this, 'alert'); 
    }, 
    alert: function() { 
     console.log(arguments); 
    } 
}); 
myObject.on('otherEvent', handler, 'otherEvent'); 

myObject.fire('alert', { 
    eventObject: true 
}); 
myObject.fire('otherEvent', { 
    first: true 
}, { 
    second: true 
});​ 
8

आप एक सामान्य प्रयोजन प्रकाशित/हब सदस्यता ले चाहते हैं, आप एक छोटे से वाक्यात्मक चीनी के साथ लाभ उठा सकते हैं ट्रिगर/पर Evented से (के रूप में pangratz कहा)। यहाँ मैं क्या कर रहा हूँ है:

 
App.Hub = Ember.Object.create({ 
    init: function(){ 
    this.set('HUB', Ember.Object.createWithMixins(Ember.Evented, {})); 
    }, 

    publish: function(){ 
    var hub = this.get('HUB'); 
    return hub.trigger.apply(hub, arguments); 
    }, 

    subscribe: function(){ 
    var hub = this.get('HUB'); 
    return hub.on.apply(hub, arguments); 
    } 
}); 

फिर, अपने आवेदन में इसका इस्तेमाल करने की:

 
App.Hub.subscribe('test-started', function(name){ 
    console.log("Test " + name + " started"); 
}); 

... 

App.Hub.publish('test-started', 'Biology I'); 
App.Hub.publish('test-started', 'Calculus'); 
+0

मैं अपने समाधान का उपयोग कर एक घटना से कैसे सदस्यता समाप्त होगा? – Parzifal

+0

@Parzifal, "सदस्यता" के समान "सदस्यता रद्द करें" विधि जोड़ें जो "ऑन" के बजाय http://emberjs.com/api/classes/Ember.Evented.html#method_off पर कॉल करता है। इसके बाद आप इसे 'App.Hub.unsubscribe (' test-start ')' का उपयोग कर सकते हैं। – digitalbreed

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