【问题标题】:Ember.js Evented Controller triggering an eventEmber.js 事件控制器触发事件
【发布时间】:2014-04-20 19:33:47
【问题描述】:

我正在尝试从 Ember.js 控制器触发一个事件,以便监听视图可以自行更新。这是咖啡脚本。

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 对象,而不是控制器。

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

任何指导将不胜感激。

【问题讨论】:

    标签: javascript jquery ember.js coffeescript evented-io


    【解决方案1】:

    我确实尝试编译您的 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 处理程序从函数调用替换为代理调用。这样可以确保在执行回调时,上下文会更新以反映当前的this

    要进一步了解 this 在 JavaScript 中的行为,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')
              @
           )
    

    【讨论】:

    • Sunny 很棒的帮助。谢谢。当我阅读您的评论时,我意识到 Coffeescript 对类上下文有不同的方法调用。 .done: => 而不是 .done: -> 将在类上下文中调用该方法。我会尝试两者并在短时间内更新。再次感谢。
    • Sunny,两种方法都有效。 $done: => 在类上下文中执行方法。
    • 太好了,你也教会了我一些新东西。 :)
    猜你喜欢
    • 2019-06-20
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多