23

我正在尝试从控制器调用视图方法,但不知道该怎么做。从视图中我可以轻松调用控制器方法,例如this.get('controller').send('method');

如何从控制器做类似的事情this.get('view').send('method');

为了让您更好地了解我正在尝试做的事情。

我有应用程序控制器Ember.Controller.extend({})我有应用程序视图Ember.View.extend({})和应用程序模板。

在应用程序模板中是登录表单,当用户提交它时执行控制器方法。在此方法中,如果登录凭据不正确,我需要调用jQueryUI在登录表单上执行方法的视图方法(准确地说是摇动方法并显示一些文本)。

4

2 回答 2

73

这听起来对Ember.Evented. 通过使用事件订阅和调度,您可以避免耦合视图和控制器。

简单地混合Ember.Evented

Controller = Ember.Controller.extend(Ember.Evented)

现在,您可以在控制器上调用ontrigger方法,订阅事件,然后启动事件。因此,在您看来,您可能会这样做:

didInsertElement: function () {
    this.get('controller').on('loginDidFail', this, this.loginFail);
}

然后在您的控制器调用this.trigger('loginDidFail')中启动您的loginFail视图方法。

请记住在视图被关闭后删除处理程序......请参阅下面的答案。

于 2013-04-13T23:09:42.640 回答
19

只是想回答这个问题,以解决在清除视图时(当路由更改时)正确删除侦听器的问题。也没有必要使用 jquery 代理,因为 on/off 方法支持目标,这很好,因为取消订阅代理肯定更复杂。修改 Christopher 提供的内容:

didInsertElement: function()
{
  this.get('controller').on('loginDidFail', this, this.loginFail);
},

willClearRender: function()
{
  this.get('controller').off('loginDidFail', this, this.loginFail);
}

在不删除订阅的情况下,对登录路由的任何后续访问(不重新加载页面)都会添加额外的监听器;即内存泄漏、错误和意外行为。

于 2014-02-20T22:43:10.820 回答