Ember.js嵌套插座 更新:1月6日13
目标: 我有一个主视图,我用它作为脚手架。我打算在主视图的不同部分插入子视图。主视图是动态的,当用户选择不同的路线时,可以用另一个视图替换主视图 方法1: 我为主视图定义了一个出口,并为主视图中的每个子视图命名了出口。对于顶级样板(主视图),插座工作正常,但不会渲染嵌套的子插座。API支持嵌套出口吗 方法2: 在子模板中,我尝试{{#with}}定义范围,以便选择正确的控制器,并使用正确的数据呈现子视图。然而,{{{#with}}}似乎没有如预期那样发挥作用 我本想安装JSFIDLE,但他们有一个更旧版本的Ember.jsEmber.js嵌套插座 更新:1月6日13,ember.js,Ember.js,目标: 我有一个主视图,我用它作为脚手架。我打算在主视图的不同部分插入子视图。主视图是动态的,当用户选择不同的路线时,可以用另一个视图替换主视图 方法1: 我为主视图定义了一个出口,并为主视图中的每个子视图命名了出口。对于顶级样板(主视图),插座工作正常,但不会渲染嵌套的子插座。API支持嵌套出口吗 方法2: 在子模板中,我尝试{{#with}}定义范围,以便选择正确的控制器,并使用正确的数据呈现子视图。然而,{{{#with}}}似乎没有如预期那样发挥作用 我本想安装JSFIDLE,但他们有一
########ROUTER Config ########
App.Router.map(function (match) {
match('').to('index');
match('/').to('index');
match('/models').to('models');
match('/list').to('list');
});
App.IndexRoute = Ember.Route.extend({
redirect : function () {
this.transitionTo('models');
}
});
App.ModelsRoute = Ember.Route.extend({
renderTemplates : function () {
var navigationController = this.controllerFor('navigation'),
fuseColController = this.controllerFor('fuseCol');
this.render('navigation-view', {
outlet : 'navigationContent',
controller : navigationController
});
this.render({ outlet : 'mainContent' });
/* this does not work , is it due to nested outlets not being supported?
Are there any events fired when render on mainContent is complete so that child views may be rendered?
this.render('col-view', {outlet : 'fuseColContainer', controller: fuseController}); */
console.log("On Models Route Render");
},
connectOutlets : function (router, context) {
console.log("On Models connnectOutlets");//Is Never called
},
connectOutlet : function (router, context) {
console.log("On Models connnectOutlet"); //Is Never called
},
setupControllers : function (controller) {
console.log("Models setupControllers called");
// this.controllerFor('fuseCol').connectOutlet('fuseColContainer', 'fuseCol');
//deprecated in the new API ?? connecteOutlet throws up error !!!
}
});
############################# Templates #######################
<script type="text/x-handlebars">
<div class="container-fluid">
{{outlet navigationContent}}//This WORKS !!!
{{outlet mainContent}}// This WORKS !!!
</div>
</script>
<script type="text/x-handlebars" id="models-view">
<div class="container-fluid">
<div class="row-fluid">
<div class="span2">
Nested Child 1
{{outlet fuseColContainer}} //Does Not Work
</div>
<div class="span10">
<div class="row-fluid">
<div class="row-fluid">
<div class="span10">Nested Child 2</div>
<div class="span2">Nested Child 3</div>
</div>
<div class="row-fluid">Nest Child 4</div>
</div>
</div>
</div>
</div>
</script>
<script type="text/x-handlebars" data-template-name="fuse-col-view" id="fuse-col-view">
<select multiple="true" id="fuseColList">
{{#each item in controller}}
<option>{{item.name}}</option>
{{/each}}
</select>
</script>
################### Controller #################
App.Router = Ember.Router.extend();
App.Router.map(function (match) {
match('').to('index');
match('/').to('index');
match('/models').to('models');
match('/list').to('list');
});
App.IndexRoute = Ember.Route.extend({
redirect : function () {
this.transitionTo('models');
}
});
App.ModelsRoute = Ember.Route.extend({
renderTemplates : function () {
var navigationController = this.controllerFor('navigation'),
fuseColController = this.controllerFor('fuseCol');
this.render('navigation-view', {
outlet : 'navigationContent',
controller : navigationController
});
this.render({ outlet : 'mainContent' });
/* This does not work , i think there should be a better approach
this.render('fuse-col-view', {outlet : 'fuseColContainer', controller : fuseColController});*/
console.log("Models render called");
},
connectOutlets : function (router, context) {
console.log("Models connnectOutlets called");
},
connectOutlet : function (router, context) {
console.log("Models connnectOutlet called");
},
setupControllers : function (controller, playlist) {
console.log("Models setupControllers called");
/*there is no connectOutlet method on controller in API ??*/
// this.controllerFor('fuseCol').connectOutlet('fuseColcontainer', 'fuseCol');
}
});
App.FuseColController = Ember.ArrayController.extend({
content : [],
init : function () {
this.pushObject(App.FuseColItem.create({name : 'Col 1'}));
this.pushObject(App.FuseColItem.create({name : 'Col 2'}));
this.pushObject(App.FuseColItem.create({name : 'Col 3'}));
}
});
App.FuseColItem = Ember.Object.extend({
name : 'Sample Col'
});
App.FuseColView = Ember.View.extend({
templateName : 'fuse-col-view'
});
路由器配置########
App.Router.map(功能(匹配){
匹配('')。到('索引');
匹配(“/”)。到('index');
匹配('/models')。到('models');
匹配('/list')。到('list');
});
App.IndexRoute=Ember.Route.extend({
重定向:函数(){
这个。过渡到(“模型”);
}
});
App.ModelsRoute=Ember.Route.extend({
renderTemplates:函数(){
var navigationController=this.controllerFor('navigation'),
fuseColController=this.controllerFor('fuseCol');
此.render('navigation-view'{
出口:'navigationContent',
控制器:导航控制器
});
render({outlet:'mainContent'});
/*这不起作用,是因为不支持嵌套插座吗?
在mainContent上渲染完成时是否触发任何事件,以便可以渲染子视图?
render('col-view',{outlet:'fuseColContainer',controller:fuseController})*/
console.log(“在模型路由渲染中”);
},
连接插座:功能(路由器、上下文){
console.log(“On Models connnectOutlets”);//从未被调用
},
connectOutlet:功能(路由器、上下文){
console.log(“On Models connnectOutlet”);//从未被调用
},
设置控制器:功能(控制器){
log(“称为控制器的模型”);
//此.controllerFor('fuseCol').connectOutlet('fuseColContainer','fuseCol');
//新API中已弃用??connecteOutlet抛出错误!!!
}
});
#############################模板#######################
{{outlet navigationContent}}//这很有效!!!
{{outlet mainContent}}//这很有效!!!
嵌套子1
{{outlet fuseColContainer}}//不工作
嵌套子2
嵌套子3
巢子4
{{{#控制器中的每个项目}
{{item.name}
{{/每个}}
###################控制器#################
App.Router=Ember.Router.extend();
App.Router.map(功能(匹配){
匹配('')。到('索引');
匹配(“/”)。到('index');
匹配('/models')。到('models');
匹配('/list')。到('list');
});
App.IndexRoute=Ember.Route.extend({
重定向:函数(){
这个。过渡到(“模型”);
}
});
App.ModelsRoute=Ember.Route.extend({
renderTemplates:函数(){
var navigationController=this.controllerFor('navigation'),
fuseColController=this.controllerFor('fuseCol');
此.render('navigation-view'{
出口:'navigationContent',
控制器:导航控制器
});
render({outlet:'mainContent'});
/*这是行不通的,我认为应该有更好的办法
render('fuse-col-view',{outlet:'fuseColContainer',controller:fuseColController})*/
log(“模型渲染调用”);
},
连接插座:功能(路由器、上下文){
log(“调用的模型”);
},
connectOutlet:功能(路由器、上下文){
log(“调用的模型”);
},
设置控制器:功能(控制器、播放列表){
log(“称为控制器的模型”);
/*API中的控制器上没有connectOutlet方法*/
//此.controllerFor('fuseCol').connectOutlet('fuseColcontainer','fuseCol');
}
});
App.FuseColController=Ember.ArrayController.extend({
内容:[],
init:函数(){
this.pushObject(App.FuseColItem.create({name:'col1'}));
this.pushObject(App.FuseColItem.create({name:'col2'}));
this.pushObject(App.FuseColItem.create({name:'col3'}));
}
});
App.FuseColItem=Ember.Object.extend({
名称:“样本列”
});
App.FuseColView=Ember.View.extend({
templateName:“fuse col视图”
});
Ember.js版本:于2013年1月3日构建
为了保持简洁,我省略了代码的其他部分。请添加注释以获取更多信息 你安装路由器了吗?如果是这样,这将自动为路由名称创建相应的命名空间视图、控制器。正如您所做的,如果您需要ArrayController,您可以手动实例化它 如果按如下方式设置路由器:
App.Router.map(function (match) {
match("/").to("col");
});
App.colRoute = Ember.Route.extend({
renderTemplate: function(){
this.render('col-view')
}
})
然后,Ember将通过路由器名称链接colView、colController(您定义的arrayController)和您的“col view”模板
我认为你不需要使用“#with”,我想我在哪里读到过,这是一种不好的做法……我想;) 嗨,沙