Поддерживает ли EmberJs шаблон публикации/подписчика?
Недавно я оценил структуру JavaScript, которая будет использоваться для нашего следующего проекта. Мне очень нравится Эмбер. Но в нашем приложении нам понадобится механизм событий из слоя данных, чтобы уведомить уровень контроллера, что что-то изменилось. Я знаю, что в Эмбере можно было бы использовать оберегающих людей, например:
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. Как только объект кэша будет обновлен, я бы хотел, чтобы уровень контроллера был уведомлен. Это в основном, почему мне нужен какой-то механизм событий на стороне JavaScript.
Обратите внимание, что причина, по которой я не хочу использовать Наблюдателей, заключается в том, что иногда событие может означать, что я должен выполнить действие, то есть загрузить сообщение или указать, что придет голосовая связь. Мне кажется, что путь позвоночника мне кажется более естественным.
Спасибо
Ответы
Ответ 1
Так как commit 2326580 - доступный с v0.9.6 - существует Ember.Evented
Mixin, см. 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
});
Ответ 2
Если вы хотите использовать концентратор публикации/подписки общего назначения, вы можете использовать триггер/включение из 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');