2013-04-01 19 views
0

我想我錯過了一些非常基本的東西,但下面的失敗與The action 'login' did not exist on App.AppControllerEmber.js:明確的目標行動失敗

模板:

<h2>Click the button and watch the console</h2> 
<button type="button" {{action login target="App.AppController"}}>Log in</button> 

控制器:

App.AppController = Ember.Controller.extend({ 
    login: function() { 
    // never gets here 
    debugger; 
    }, 
    send: function() { 
    // or even here 
    debugger; 
    } 
}); 

JSBin:http://jsbin.com/okuqiv/5/edit(這是指向灰燼最新的,但它與1.0-RC2,我一直在使用的版本相同的行爲幾天;我還沒有嘗試過以前的版本)。在調試時,控制器mixin似乎並沒有公開所有的函數 - login()是我添加的函數,但send()是一個Ember函數。它也缺少get()等其他函數。

我看到在我的應用程序中,對象App.AppController.prototype上存在login()函數,而在JSBin中,它存在於mixin鏈中的一個對象上。

在這一點上,我甚至很樂意處理視圖中的登錄操作或路由器(因爲它似乎是過去的默認設置),但這些似乎都不起作用。

從文檔中,操作處理程序應該生存的當前默認位置是控制器,然後是路由,但是如果我刪除目標並向路由添加login(),則會出現另一個錯誤:Nothing handled the event 'login'(我首先使用目標,因爲在我的應用程序/登錄是一個單獨的路線,並有一個不同的控制器)。

解決方案和解決方法將非常感謝!

回答

0

您正瞄準類App.AppController而不是該類的實際實例。如果您使用的是路由器並且位於應用程序視圖中,那麼默認情況下,操作將針對appController。

我已經更新了JSbin調用登錄上的IndexController因爲你的例子是在指數路徑:

http://jsbin.com/okuqiv/10/

你也騎過的發送方法,它是防止登錄被調用。

+0

不久前我在IRC得到了答案。你是對的,我的目標是定義/單例,而不是實例,但問題是如何定位不同的控制器(爲簡單起見,jsbin被簡化了),對這個問題的答案是使用{ {action login target =「controllers.app」}}。 –

+0

仍將標記爲已回答:) –

+0

最終解決方案還要求操作環境中的控制器具有需求:['app'],以便該操作可由AppController處理。 –