我试图为一组对象(对话)呈现一组选项卡,使用每个对象的呈现帮助器。它不是路由的一部分,因为它是接口的持久部分。我遇到了一个问题,只有与模型同名的视图才能获得预期的控制器(即面板内容而不是选项卡标题)。
我有一个聊天模型,对象控制器和数组控制器(这里故意简化):
App.Chat = DS.Model.extend({ });
App.ChatsController = Ember.ArrayController.extend({
needs: 'application',
content: Ember.computed.alias('controllers.application.currentChats'),
});
App.ChatController = Ember.ObjectController.extend({ });
ArrayController需要need/content属性,因为聊天记录是在应用程序控制器中加载的。我使用currentChats的名称,因为其他路由可能会加载非当前聊天。
App.ApplicationController = Ember.Controller.extend({
init: function(){
this.store.find('chat', {"current": true});
this.set('currentChats', this.store.all('chat'));
}
});
我毫不费力地用适当的控制器呈现聊天内容(到'chat'模板中)。然而,聊天选项卡被赋予了默认的ObjectController,因此不能触发动作。
<script type="text/x-handlebars" id="application">
<!--application template-->
{{outlet chats}}
</script>
<script type="text/x-handlebars" id="chats">
<div id="chats">
<ul id="chat-tabs">
{{#each}}
{{render 'chatTab' this}}
{{/each}}
</ul>
{{#each}}
{{render 'chat' this}}
{{/each}}
</div>
</script>
<script type="text/x-handlebars" id="chatTab">
<!--tab template-->
</script>
<script type="text/x-handlebars" id="chat">
<!--chat template-->
</script>
应用路由器如下:
App.ApplicationRoute = Ember.Route.extend({
model: function(){ },
renderTemplate: function(){
this.render('application', { });
this.render('chats', {
into: 'application',
outlet: 'chats',
controller: 'chats'
});
}
});
这似乎完全归结为模板的命名。名为"chat"的模板继承了正确的控制器,但chatTab没有,尽管它接收了一个聊天作为模型。有没有办法强制视图继承正确的控制器?或者我是在用一种特殊的方式来做这件事吗?
非常感谢你对这个烬新手的帮助。
安德鲁它完全脱离提供给渲染的名称。最简单的方法是创建另一个控制器并扩展聊天控制器。
App.ChatTabController = App.ChatController.extend();