Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js嵌套插座 更新:1月6日13_Ember.js - Fatal编程技术网

Ember.js嵌套插座 更新:1月6日13

Ember.js嵌套插座 更新:1月6日13,ember.js,Ember.js,目标: 我有一个主视图,我用它作为脚手架。我打算在主视图的不同部分插入子视图。主视图是动态的,当用户选择不同的路线时,可以用另一个视图替换主视图 方法1: 我为主视图定义了一个出口,并为主视图中的每个子视图命名了出口。对于顶级样板(主视图),插座工作正常,但不会渲染嵌套的子插座。API支持嵌套出口吗 方法2: 在子模板中,我尝试{{#with}}定义范围,以便选择正确的控制器,并使用正确的数据呈现子视图。然而,{{{#with}}}似乎没有如预期那样发挥作用 我本想安装JSFIDLE,但他们有一

目标:

我有一个主视图,我用它作为脚手架。我打算在主视图的不同部分插入子视图。主视图是动态的,当用户选择不同的路线时,可以用另一个视图替换主视图

方法1:

我为主视图定义了一个出口,并为主视图中的每个子视图命名了出口。对于顶级样板(主视图),插座工作正常,但不会渲染嵌套的子插座。API支持嵌套出口吗

方法2: 在子模板中,我尝试{{#with}}定义范围,以便选择正确的控制器,并使用正确的数据呈现子视图。然而,{{{#with}}}似乎没有如预期那样发挥作用

我本想安装JSFIDLE,但他们有一个更旧版本的Ember.js

########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”,我想我在哪里读到过,这是一种不好的做法……我想;)

嗨,沙