簡體   English   中英

Ember.js事件控制器觸發事件

[英]Ember.js Evented Controller triggering an event

我正在嘗試從Ember.js控制器觸發事件​​,以便偵聽視圖可以自我更新。 這是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沒有方法觸發器。 .done函數中的@引用jQuery post對象而不是控制器。

如何從jQuery回調內部獲取對父控制器對象的引用?

任何指導將不勝感激。

我確實嘗試編譯您的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, 請閱讀這篇文章

供您參考,這是我的解決方案的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')
          @
       )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM