Ember.js - 如何从控制器触发视图方法?

Woj*_*ski 23 javascript ember.js

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

如何从控制器那样做this.get('view').send('method');

为了让您更好地了解我正在尝试做什么.

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

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

Chr*_*sey 73

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

简单地混合Ember.Evented:

Controller = Ember.Controller.extend(Ember.Evented)
Run Code Online (Sandbox Code Playgroud)

现在,您可以在控制器上调用on和调用trigger方法,订阅事件,然后启动事件.因此,在您看来,您可能会:

didInsertElement: function () {
    this.get('controller').on('loginDidFail', this, this.loginFail);
}
Run Code Online (Sandbox Code Playgroud)

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

记得在视图被解除后删除处理程序...请参阅下面的答案.

  • @RostyslavDiachok实际上`this.get('view')`毫无意义,因为你没有特定控制器支持多少个视图. (9认同)
  • 如果视图将被销毁,请不要忘记删除侦听器. (4认同)
  • Ember每天都让我惊讶! (2认同)
  • @RostyslavDiachok这是发布 - 订阅设计模式的一个相当典型的实现.虽然它的表面可能看起来不明显,但它是一种经过时间考验的技术,用于解耦对象.即使你在控制器上有一个参考视图,控制器也有责任开除基本上是副作用的东西. (2认同)

Aar*_*rck 19

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

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

willClearRender: function()
{
  this.get('controller').off('loginDidFail', this, this.loginFail);
}
Run Code Online (Sandbox Code Playgroud)

在不删除订阅的情况下,任何后续访问登录路由(无需重新加载页面)都将添加其他侦听器; 即内存泄漏,错误和意外行为.