如何从控制器触发视图方法

Ember.js - How to trigger view method from controller?

本文关键字:视图 方法 控制器      更新时间:2023-09-26

我试图从控制器调用视图方法,但不知道如何做到这一点。从视图中,我可以很容易地调用控制器方法,如this.get('controller').send('method');

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

为了让你更好地了解我在做什么

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

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

这听起来像是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视图方法

记得在视图被解散后删除处理程序…

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

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

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