5

编码

我在新路由器上使用版本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模板

问题

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

编辑 2013-01-07

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

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

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

当用户登陆应用程序页面时,由于他没有经过身份验证,因此呈现的是未经身份验证的块。一切都运行良好,除了没有任何东西渲染到{{outlet}}标签中......

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

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

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

4

2 回答 2

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) 状态的变化,您的模板将自动更新以反映应用程序状态。

于 2013-01-06T20:48:39.087 回答
2

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

这刚刚被合并到master中:https ://github.com/emberjs/ember.js/pull/1671#issuecomment-11982451

于 2013-01-07T23:22:56.537 回答