我确实尝试编译你的 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')
@
)