3

我希望我的 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,所以我希望答案很简单。

4

1 回答 1

2

Ember.Instrumentation是一个简单的软件工具API。它的目的是性能分析、跟踪,而不是应用程序级别的事件分派。

Ember.STRUCTURED_PROFILE您可以通过设置为 true来查看此 api 的运行情况。这将开始记录 ember 渲染到 DOM 的所有模板的渲染时间。

您遇到的具体问题涉及 Ember 的runloop工作原理。after挂钩仅在给出最后一个上下文的情况下触发一次。这样做是为了确保同一属性的多个属性更改不会导致多次重新渲染 DOM。因此,获胜的最后一个属性更改,runloop并且 DOM 使用该属性值更新。

您真正需要做的只是将FB.Eventof 类型edge.create转换为您的应用程序可以理解的应用程序事件,类似于“facebookLike”,类似于您在上面所做的。

我会在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
}

然后你可以ContestController像这样处理这个事件,

facebookLike: function(response) {

}
于 2013-07-02T07:14:12.667 回答