如何使用新路由器重新呈现应用程序模板?

时间:2013-01-06 18:01:34

标签: ember.js

代码

我正在使用版本4fcdbf2560和新路由器。

在我的应用程序中,用户可以进行身份​​验证。根据身份验证状态,呈现的模板将不相同。

我通过重新定义renderTemplate中的ApplicationRoute函数来管理这一点:

App.ApplicationRoute = Ember.Route.extend({
    renderTemplate: function() {
        this.render(App.authenticated() ? 'authenticated' : 'unauthenticated');
    }
});

我的路由器非常简单:

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

    match('/sign').to('sign', function(match) {
        match('/in').to('signIn');
    });

    match('/dashboard').to('dashboard');
});

IndexRoute就是根据身份验证状态重定向用户:

App.IndexRoute = Ember.Route.extend({
    redirect: function() {
        this.transitionTo(App.authenticated() ? 'dashboard' : 'signIn');
    }
});

工作流程

  1. 用户导航至/
  2. 输入ApplicationRoute,因为未对用户进行身份验证,呈现unauthenticated模板
  3. 输入IndexRoute,因为用户未经过身份验证,重定向到signIn
  4. signIn模板渲染到其父模板中 - > unauthenticated模板
  5. 用户成功登录,route.transitionTo('dashboard')被称为
  6. dashboard模板渲染到其父模板中 - > unauthenticated模板
  7. 问题

    • 我的实施有什么问题?
    • 为什么在呈现renderTemplate模板时不会调用dashboard函数?
    • 如何强制应用程序重新呈现其模板?

    编辑2013-01-07

    我根据Evan的回答修改了我的代码。

    我的应用程序模板现在看起来像这样:

    {{#if isAuthenticated}}
        <h1>Authenticated</h1>
        {{outlet}}
    {{else}}
        <h1>Unauthenticated</h1>
        {{outlet}}
    {{/if}}
    

    当用户登陆应用程序页面时,由于他未经过身份验证,因此它是未经身份验证的块。除了没有任何内容呈现在{{outlet}}标记...

    之外,一切都运行良好

    但是当我的应用程序模板看起来像这样时(=没有条件标签):

    <h1>Unauthenticated</h1>
    {{outlet}}
    

    ......它有效!所以我想知道是否可以在条件标签之间插入{{outlet}}标签。

2 个答案:

答案 0 :(得分:2)

我认为在路由器中使用这个逻辑可能是个错误;相反,它应该是ApplicationController的一部分。

由于ember会在应用程序状态更改时自动更新模板,因此您可以创建跟踪身份验证状态的ApplicationController

App.ApplicationController = Ember.Controller.extend({
    isAuthenticated: null
});

按照以下方式构建模板:

<script type="text/x-handlebars" data-template-name="application">
    {{ #if isAuthenticated }}
        You are now logged in
    {{ else }}
        Please Log In
    {{ /if }}
</script>

现在您实际上不必担心手动更新/呈现模板。随着内部(JS)状态的更改,您的模板将自动更新以反映应用程序状态。

答案 1 :(得分:2)

sly7_7 comment就是答案。有关插座内部的插座,请参阅github.com/emberjs/ember.js/pull/1671

刚刚合并到主人:https://github.com/emberjs/ember.js/pull/1671#issuecomment-11982451