2013-01-06 33 views
10

我的索引模板有兩個出口,一個用於標題,另一個用於內容。呈現在內容中的模板根據正在觀看的內容而改變。如何在路由器v2中呈現路由的多個模板

在舊路由器中,可以通過在擁有該模板的不同控制器上調用connectOutlet來完成此操作。我無法弄清楚如何在新路由器中做同樣的事情。

有什麼建議嗎?

回答

18

隨着我的研究,我來到了這一點: 說你有一個像這樣定義的路由器:

App.Router.map(function(match) { 
    match('/').to('index'); 
}); 

ApplicationTemplate:

<script type="text/x-handlebars"> 
{{outlet header}} 
{{outlet}} 
</script> 

IndexTemplate:

<script type="text/x-handlebars" data-template-name="index"> 
{{outlet dashboard}} 
{{outlet spaces}} 
</script> 

現在,我們要的是,當用戶進入該指數路由器,該頁面應該:

  • 渲染指數爲主要出口和頭到應用程序的首部出口模板。
  • 將儀表板,空間模板渲染到索引模板中。

要做到這一點,我們寫indexRoute

App.IndexRoute = Em.Route.extend({ 
    renderTemplate: function(controller, model){ 
     //Render header into header outlet 
     this.render('header',{ 
      outlet:'header' 
     }); 
     //Render index into main outlet. If you comment out 
     //this line, the code below fails 
     this.render('index'); 

     //by using into, we can render into the index template 
     //Note: The controller is optional.if not specified, 
     //ember picks up controller for the given template. 
     this.render('dashboard',{ 
      outlet:'dashboard', 
      into:'index', 
      controller:this.controllerFor('somethingElse', App.TestModel.find()) 
     }); 
     //controller is SpacesController 
     this.render('spaces',{ 
      outlet:'spaces', 
      into:'index' 
     }); 
    } 
}); 
+1

和我原來的答案相當相似吧? –

+0

我的第一個想法是要求你更新你的函數以符合最新的ember,以便我可以接受你的答案。 但是,我真正想要的是this.render('index')並隨後呈現給它。您的代碼僅呈現到應用程序模板中。這與正確的方式來分配控制器的內容使我寫了一個新的答案 – adivis

+0

爲什麼兩個模板的名稱都是'index',即'data-template-name'屬性值'index'? – Ygg

11

可以使用renderTemplates功能的路由器來呈現多視圖的命名網點:

renderTemplates:function() { 
    this.render('todos_list', { 
     into:'todos', //template name 
     outlet: 'todos', //named outlet 
     controller: 'listController' //controller you want to use 
    }); 
    this.render('todos_test', { 
     into:'todos', 
     outlet: 'test', 
     controller: 'testController' 
    }); 
}, 

setupControllers:function (controller, model) { 
    this.controllerFor('list').set('content', listmodel.find()); 
    this.controllerFor('test').set('content', testmodel.find()); 
} 

的setupControllerControllerFor功能將允許你指定我們設置爲原路由器「語境」。

在模板中,你會像以前一樣的名字網點:

{{outlet list}} 
{{outlet test}} 

希望這有助於:)

+1

下面的代碼似乎setupControllers和renderTemplates已經燼,最新被棄用。 – adivis

+0

嗯......你確定嗎?燼寶網站上的新指南提醒他們:http://emberjs.com/guides/controllers/representing-multiple-models-with-arraycontroller/ –

+2

5小時前剛合併。 [這一個](https://github.com/emberjs/ember.js/commit/6d771b7a9389fff826b8f2e500721da6a7ce2fc0)和[this](https://github.com/emberjs/ember.js/commit/2468b42f801dc192a6e762293f3590d25274dfd0)。但是會用新功能嘗試你的代碼。 – adivis

相關問題