在Ember JS中订阅全球javascript事件

时间:2016-04-18 15:24:15

标签: ember.js

我在我们的Ember JS应用程序中实现了Ziggeo(http://ziggeo.com/),并且Ziggeo有一个Javascript SDK,您可以订阅这样的事件

ZiggeoApi.Events.on("submitted", function (data) {
   alert("Submitted a new video with token '" + data.video.token + "'!");
});

如果我在JS中全局添加它,我设法收到该事件:

<script>
  ZiggeoApi.token = 'myToken';
  ZiggeoApi.Events.on("submitted", function (data) {
    console.log('video updated: ' + data);
  });
</script>

但是我如何在Ember(控制器)中听全局事件?

我尝试了这个,它以某种方式工作,除了“this”上下文不是控制器,所以我不能调用其他的ember组件,如store,或者store.createRecord等。

export default Ember.Controller.extend(Ember.Evented, {
session: Ember.inject.service('session'),

  ziggeoRecordDone: ZiggeoApi.Events.on("submitted", (function(data) {
      console.log("Ziggeo Record Done YEAH; HURRA");
      ZiggeoApi.videoOnLoad = data.video.token;
     ...

1 个答案:

答案 0 :(得分:0)

我的解决方案是:

  1. 覆盖控制器的init功能
  2. 添加initZiggeo功能,以绑定您的ziggeo事件
  3. 要在回调中使用store,您必须声明另一个引用this的变量,我使用了var self = this;
  4. 如果您的回调会更新任何控制器或模型属性,则需要使用ember循环(有关run loop的更多信息)
  5. 您的控制器将如下所示:

    export default Ember.Controller.extend(Ember.Evented, {
    session: Ember.inject.service('session'),
    
    //Initializing controller 
    init:function(){
    
    this._super();     
    
    this.initZiggeo();
    },
    
    initZiggeo:function(){
    
       var self = this;
    
       ZiggeoApi.Events.on("submitted", function(data) {
    
         //If you want your events update the ember code
         Ember.run.once(self,function(){
    
           console.log("Ziggeo Record Done YEAH; HURRA");
    
           ZiggeoApi.videoOnLoad = data.video.token;
    
         });
    
       });
    }