[英]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.