【问题标题】:Ember.js Rendering outlet as a modal windowEmber.js 将出口渲染为模态窗口
【发布时间】:2013-04-05 00:46:00
【问题描述】:

我正在尝试渲染模式。为此,我使用{{outlet modalOutlet}} 创建了一个自定义插座我的应用程序模板有两个插座,默认插座和modalOutlet。但是,当模态模板呈现为{{outlet modalOutlet}} 时,我的默认{{outlet}} 变为空。

如何更改它,以便默认的 {{outlet}} 不会更改,因此我实际上可以将 {{outlet modalOutlet}} 呈现为模式窗口,或作为布局的一部分的侧边栏

我不确定这是由于我的代码,还是与我缺少的 renderTemplate() 方法有关。 jsFiddle with my code is here

// Router
App.Router.map(function(){
    this.route('contributors');
    this.route('contributor', {path: '/contributors/:contributor_id'});
});


App.ContributorsRoute = Ember.Route.extend({
    model: function() {
        return App.Contributor.all();
    },
});

App.ContributorRoute = Ember.Route.extend({
    renderTemplate: function() {
        this.render('contributor', {
            outlet: 'modalOutlet'
        });
    }
});

<script type="text/x-handlebars" data-template-name="application">  
    <nav>
        {{#linkTo "index"}}Home{{/linkTo}}
        {{#linkTo "contributors"}}Contributors{{/linkTo}}
    </nav>
    <div style='padding:5px;margin:5px;border:1px dotted red;'>
        Default Outlet
        {{outlet}}
    </div>
    <div style='padding:5px;margin:5px;border:1px dotted blue;'>    
        modalOutlet
        {{outlet modalOutlet}}
    </div>
</script>

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    您还必须渲染 contributors 模板,因为当您转换到同级路由时,默认出口会被清除。

    App.ContributorRoute = Ember.Route.extend({
        renderTemplate: function() {
            this.render('contributors');
            this.render('contributor', {
                outlet: 'modalOutlet'
            });
        }
    });
    

    但是,如果您像这样嵌套路由,则可以避免这种情况:

    App.Router.map(function(){
        this.resource('contributors', function() {
            this.route('show', {path: ':contributor_id'});
        });
    });
    

    ...并调整应用程序的其余部分以匹配新结构。在这种情况下,您需要使用into 选项指定modalOutlet 所在的位置(在这种情况下:'application'

    【讨论】:

    • 很高兴您提供了两种解决方案!
    【解决方案2】:

    问题是你的路由结构没有嵌套,一旦你嵌套了你的路由,你就需要指定包含模态出口的路由。

    发生了什么是你渲染

    应用程序 -> 贡献者

    显示您的列表,但是当您单击链接时,您现在正在呈现

    应用程序 -> 贡献者

    并且Contributor 模板被删除。

    如果你嵌套你的路线,像这样:

    应用程序 -> 贡献者 -> 贡献者

    那么您仍将拥有显示列表的Contributors 模板。

    updated JSFiddle

    //Router
    App.Router.map(function(){
        this.resource('contributors', function() {
            this.resource('contributor', {path: '/:contributor_id'});
        });   
    });
    
    //Route
    App.ContributorRoute = Ember.Route.extend({
        renderTemplate: function() {
            this.render('contributor', {
                into: 'application',
                outlet: 'modalOutlet'
            });
        }
    });
    

    【讨论】:

    • 你将如何使用模式实现像 Pinterest 这样的事情?您可以在多个不同的 url 上使用相同的“pin”模式。例如索引、用户配置文件、类别等。你会简单的复制上面的Router来在不同的资源下使用同一个outlet吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多