Поддерживает ли 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');