我希望我的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所以我希望答案很简单。
答案 0 :(得分:2)
Ember.Instrumentation
是一个简单的软件instrumentation api。它的目的是性能分析,跟踪,而不是应用程序级事件调度。
您可以通过将Ember.STRUCTURED_PROFILE
设置为true来查看此API。这将开始记录由ember呈现给DOM的所有模板的渲染时间。
您正在处理的具体问题是如何使用Ember runloop
。 after
挂钩仅在给定最后一个上下文的情况下触发一次。这样做是为了确保同一属性的多个属性更改不会导致多次重新呈现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
}