2012-03-16 132 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