Ember.js Evented Controller запускающий событие
Я пытаюсь вызвать событие из контроллера 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, а не к контроллеру.
Как получить ссылку на родительский объект контроллера из обратного вызова jQuery?
Любое руководство будет оценено.
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, прочитайте эту статью.
Для справки, вот эквивалент 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')
@
)