javascript - Ember.js Evented Controller 触发事件

标签 javascript jquery ember.js coffeescript evented-io

我正在尝试从 Ember.js Controller 触发一个事件,以便监听 View 可以自行更新。这是 Coffeescript。

window.CMS.EdmController = Ember.ObjectController.extend Ember.Evented,
  actions:
   save_edm: ->
     postData = $('#edm_form').serialize()
     $.ajax(
       url: 'cms2/update_edm',
       type: 'POST',
       data: postData
       )
       .done ->
         console.log(@)
         @trigger('saveEdmSuccessful')

它失败并出现错误 Object #Object has no method trigger。 .done 函数中的 @ 指的是 jQuery post 对象而不是 Controller 。

如何从 jQuery 回调中获取对父 Controller 对象的引用?

如有任何指导,我们将不胜感激。

最佳答案

我确实尝试编译您的 Coffeescript 并最终得到以下代码作为输出:

window.CMS.EdmController = Ember.ObjectController.extend(Ember.Evented, {
  actions: {
    save_edm: function() {
      var postData;
      postData = $('#edm_form').serialize();
      return $.ajax({
        url: 'cms2/update_edm',
        type: 'POST',
        data: postData
      }).done(function() {
        console.log(this);
        return this.trigger('saveEdmSuccessful');
      });
    }
  }
});

您面临的问题的解决方案与 ember.js 无关,而是 Javascript 闭包的工作方式。上述问题的解决方案是:

window.CMS.EdmController = Ember.ObjectController.extend(Ember.Evented, {
  actions: {
    save_edm: function() {
      var postData;
      postData = $('#edm_form').serialize();
      return $.ajax({
        url: 'cms2/update_edm',
        type: 'POST',
        data: postData
      }).done($.proxy(function() {
        console.log(this);
        return this.trigger('saveEdmSuccessful');
      },this));
    }
  }
});

请注意我是如何将您的 .done 处理程序从函数调用替换为代理调用的。这确保在执行回调时,上下文会更新以反射(reflect)当前的 this

要进一步了解 JavaScript 中 this 的行为,read this article .

为了您的引用,这里是我的解决方案的 CoffeeScript 等价物:

window.CMS.EdmController = Ember.ObjectController.extend Ember.Evented,
  actions:
   save_edm: ->
     postData = $('#edm_form').serialize()
     $.ajax(
       url: 'cms2/update_edm',
       type: 'POST',
       data: postData
       )
       .done(
          $.proxy ->
            console.log(@)
            @trigger('saveEdmSuccessful')
          @
       )

关于javascript - Ember.js Evented Controller 触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22423141/

相关文章:

javascript - 在 nintex 表单中使用 javascript 验证电子邮件地址、电话、身份证号码

javascript - 以对象的形式访问数字

javascript - 显示在 ReactJS 中显示模态的按钮列表

javascript - Accordion 防止点击链接

jquery - 验证检查带有单独提交按钮的动态文本框

ember.js - 如何构建 Ember.js 应用程序

javascript - Google Places Autocomplete 没有出现

javascript - Typescript 中类型为 'someProp' 的值不存在属性 'object'

javascript - jquery 无法删除数据表中的多行

ember.js - emberjs + ember-data 子资源