gpt4 book ai didi

javascript - Ember.js Evented Controller 触发事件

转载 作者:行者123 更新时间:2023-11-30 17:33:59 26 4
gpt4 key购买 nike

我正在尝试从 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com