簡體   English   中英

Ember.js - 如何從控制器觸發視圖方法?

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

我試圖從控制器調用view方法,但不知道如何做到這一點。 從視圖中我可以很容易地調用控制器方法,如this.get('controller').send('method');

如何從控制器this.get('view').send('method');執行類似的操作this.get('view').send('method');

為了讓您更好地了解我正在嘗試做什么。

我有應用程序控制器Ember.Controller.extend({})我有應用程序視圖Ember.View.extend({})和應用程序模板。

在應用程序模板是登錄表單,當用戶提交它時,執行控制器方法。 在這種方法中,如果登錄憑證不正確,我需要調用在登錄表單上執行jQueryUI方法的view方法( jQueryUI抖動方法並顯示一些文本)。

這對Ember.Evented聽起來很有用。 通過使用事件訂閱和調度,您可以避免耦合視圖和控制器。

簡單地混合Ember.Evented

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

現在,您可以on控制器上調用和trigger方法,訂閱事件,然后啟動事件。 因此,在您看來,您可能會:

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

然后在你的控制器中調用this.trigger('loginDidFail')來啟動你的loginFail視圖方法。

記得在視圖被解除后刪除處理程序...請參閱下面的答案。

只是想回答這個問題,以解決在清除視圖時(路由更改時)正確刪除偵聽器的問題。 它也沒有必要使用jquery代理,因為開/關方法支持目標,這很好,因為取消訂閱代理肯定更復雜。 修改克里斯托弗提供的內容:

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

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

在不刪除訂閱的情況下,任何后續訪問登錄路由(無需重新加載頁面)都將添加其他偵聽器; 即內存泄漏,錯誤和意外行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM