Подтвердить что ты не робот

Ember.js - Как вызвать метод просмотра с контроллера?

Я пытаюсь вызвать метод view из контроллера, но не знаю, как это сделать. Из вида я могу легко вызвать метод контроллера, например this.get('controller').send('method');

Как сделать что-то подобное с помощью контроллера this.get('view').send('method');?

Чтобы дать вам лучший обзор, что я пытаюсь сделать.

У меня есть контроллер приложения Ember.Controller.extend({}) У меня есть вид приложения Ember.View.extend({}) и шаблон приложения.

В шаблоне приложения находится форма входа в систему, когда пользователь отправляет его, когда выполняется метод контроллера. В этом методе, если учетные данные для входа неверны, мне нужно вызвать метод представления, который выполняет метод jQueryUI в форме входа в систему (т.е. Метод будет точным и показать некоторый текст).

4b9b3361

Ответ 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);
}

Без удаления подписки любые последующие посещения маршрута входа (без перезагрузки страницы) добавят дополнительных слушателей; то есть утечки памяти, ошибки и непредвиденное поведение.