Ember.js - Как вызвать метод просмотра с контроллера?
Я пытаюсь вызвать метод view из контроллера, но не знаю, как это сделать. Из вида я могу легко вызвать метод контроллера, например this.get('controller').send('method');
Как сделать что-то подобное с помощью контроллера this.get('view').send('method');
?
Чтобы дать вам лучший обзор, что я пытаюсь сделать.
У меня есть контроллер приложения Ember.Controller.extend({})
У меня есть вид приложения Ember.View.extend({})
и шаблон приложения.
В шаблоне приложения находится форма входа в систему, когда пользователь отправляет его, когда выполняется метод контроллера. В этом методе, если учетные данные для входа неверны, мне нужно вызвать метод представления, который выполняет метод jQueryUI
в форме входа в систему (т.е. Метод будет точным и показать некоторый текст).
Ответы
Ответ 1
Это звучит неплохо для Ember.Evented
. Используя подписку на события и диспетчеризацию, вы можете избежать соединения вашего представления и контроллера.
Просто mixin Ember.Evented
:
Controller = Ember.Controller.extend(Ember.Evented)
Теперь вы можете вызвать методы on
и trigger
на вашем контроллере, подписаться на событие и затем запустить событие. Итак, на ваш взгляд, вы можете:
didInsertElement: function () {
this.get('controller').on('loginDidFail', this, this.loginFail);
}
И затем в своем контроллере вызовите this.trigger('loginDidFail')
, чтобы запустить ваш метод просмотра loginFail
.
Не забудьте удалить обработчик после отклонения представления... см. ответ ниже.
Ответ 2
Просто хотел ответить на этот вопрос, чтобы решить проблему с правильным удалением слушателя, если вид очищается (когда маршрут изменяется). Также не нужно использовать прокси-сервер jquery, поскольку методы on-off поддерживают цель, что хорошо, потому что отмена подписки на прокси-сервер определенно сложнее. Пересмотр того, что предоставил Кристофер:
didInsertElement: function()
{
this.get('controller').on('loginDidFail', this, this.loginFail);
},
willClearRender: function()
{
this.get('controller').off('loginDidFail', this, this.loginFail);
}
Без удаления подписки любые последующие посещения маршрута входа (без перезагрузки страницы) добавят дополнительных слушателей; то есть утечки памяти, ошибки и непредвиденное поведение.