2013-04-11 126 views
0

我想了解新路由器系統中的控制器。我明白他們存在來裝飾模型,並呈現非永久狀態的視圖/模板進行渲染。我瞭解Ember路由器用於從路由名稱實例化和設置每個控制器的單個副本的約定。但這是否意味着你永遠不應該有一個以上的控制器副本?這裏是我的用例:我有一組複雜的非持久性每個項目狀態(不同級別的摺疊/可見嵌套,不同編輯模式等)的一組嵌套列表。我不認爲這屬於視圖,它太複雜(因爲嵌套),以保持單身控制器 - 所以我打算有一個控制器實例每個視圖實例(儘管所有相同的控制器和視圖類)。這是聲音嗎?Ember.js使用新路由器訪問和組織控制器

二,更簡單的問題。如何訪問Ember路由器實例化的控制器?以前,你可以做App.get('router.postController')但不再有效。

回答

1

首先問

並非所有的控制器都是單身。有些情況下Ember.js會爲您創建非單件控制器。

{{#each model itemController="post"}} 
    <!-- template here --> 
{{/each}} 

這將在循環中每post項目創建的App.PostController一個新實例:使用itemController{{each}}幫手

一種情況是。其他

一種情況是,當你使用{{render}}助手,並通過一個模型來它:

{{render "post" firstPost}} 
{{render "post" secondPost}} 

這將爲每個{{render}}創建一個單獨的App.PostController實例。

第二個問題

這要看你想從訪問它們。

從路線:

this.controllerFor("post"); 

從另一個控制器:

App.CommentController = Ember.ObjectController.extend({ 
    needs: ['post'], 
    test: function() { 
    return this.get('controllers.post'); // this returns the post controller 
    } 
}); 

在這裏更多信息:http://emberjs.com/guides/controllers/dependencies-between-controllers/

從視圖:

this.get('controller'); 
+0

謝謝,這是有幫助的。至於第二個問題,有沒有辦法從全局上下文訪問控制器,例如在控制檯中? – 2013-04-11 18:10:51

+0

是的,'App .__ container __。lookup('controller:post')',但**只在測試中**,不要在您的應用程序中使用它。 – 2013-04-11 18:13:31

+0

那是因爲這會破壞Ember的預期範圍嗎?您是否真的沒有想要訪問路由器,視圖或控制器之外的控制器? (我現在想不到一個,但我不知道..也許在非單一非路由器實例化控制器的情況下) – 2013-04-11 20:01:43