2012-03-16 64 views
10

我最近正在評估一個JavaScript框架,用於我們的下一個項目。我真的很喜歡Ember。但在我們的應用程序中,我們需要一個來自數據層的事件機制來通知控制器層有什麼變化。我知道有一個能在餘燼使用obersevers,例如,:EmberJs是否支持發佈/訂閱者事件模式?

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中是否可行?

也給你一些關於我的問題的背景,我們的應用程序是一個實時應用程序。所以有時候,後端RESTful服務會將一個事件觸發到客戶端(JavaScript端)。我想有一個數據層封裝對後端RESTful服務的訪問,但也保留一個緩存。我希望EmberJS.Data可以幫助我(這是一個單獨的問題,我想找到答案)。因此,我希望在後端RESTful服務發生更改時更新緩存。一旦緩存對象被更新,我想要通知Controller層。這基本上是爲什麼我需要JavaScript方面的一些事件機制。

請注意,我不想使用觀察者的原因是,有時候,事件可能意味着我必須執行操作,即加載消息或指示語音呼叫即將到來。骨幹方式對我來說似乎更加自然。

感謝

回答

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

如果你想有一個通用的發佈/訂閱中心,可以從事件觸發一個小語法糖利用觸發/上(如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 2014-05-12 07:38:48

+0

@Parzifal,添加一個類似於「訂閱」的方法「取消訂閱」,它調用http://emberjs.com/api/classes/Ember.Evented.html#method_off而不是「on」。然後,您可以像App.Hub.unsubscribe('test-started')一樣使用它。 – digitalbreed 2014-06-28 07:29:18