如何让我的ArrayController中的项目听取来自第三方API的事件?

时间:2013-07-01 09:55:51

标签: ember.js

我希望我的ArrayController中的项目能够收听

FB.Event.subscribe('edge.create', function(response){
  Ember.Instrumentation.instrument("facebook.like", response);
})

我正在使用一个单独的itemController。

Like2win.ContestsController = Ember.ArrayController.extend({
  itemController: "contest",
});
Like2win.ContestController = Ember.ObjectController.extend({
  init: function() {
    this._super();
    instance = this;
    Ember.subscribe("facebook.like", {
      before: function(name, timestamp, payload) {
        instance.send('onLike', payload);
      },
      after: function(name, timestamp, payload) {
        //
      }
    })
  },

由于某种原因,我的数组中的最后一项最终只能听到该事件。我刚刚开始使用Emberjs所以我希望答案很简单。

1 个答案:

答案 0 :(得分:2)

Ember.Instrumentation是一个简单的软件instrumentation api。它的目的是性能分析,跟踪,而不是应用程序级事件调度。

您可以通过将Ember.STRUCTURED_PROFILE设置为true来查看此API。这将开始记录由ember呈现给DOM的所有模板的渲染时间。

您正在处理的具体问题是如何使用Ember runloopafter挂钩仅在给定最后一个上下文的情况下触发一次。这样做是为了确保同一属性的多个属性更改不会导致多次重新呈现DOM。因此,runloop上的最后一次属性更改获胜,并且DOM使用该属性值进行更新。

您真正需要做的只是将类型FB.Event的{​​{1}}翻译成您的应用理解的应用事件,类似于“facebookLike”,类似于您上面所做的。

我会在您edge.create的{​​{1}}勾段中执行此操作。进一步退出enter应该可以取消订阅此事件。所以你可能需要在ContestRoute钩子中取消订阅。

ContestRoute

然后您可以在exit中像这样处理此事件,

enter: function() {
  var self = this;
  FB.Event.subscribe('edge.create', function(response) {
    self.get('controller').send('facebookLike', response);
  });
}

exit: function() {
  // unsubscribe from edge.create events here
}