我正在使用版本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');
}
});
/
ApplicationRoute
,因为未对用户进行身份验证,呈现unauthenticated
模板IndexRoute
,因为用户未经过身份验证,重定向到signIn
signIn
模板渲染到其父模板中 - > unauthenticated
模板route.transitionTo('dashboard')
被称为dashboard
模板渲染到其父模板中 - > unauthenticated
模板renderTemplate
模板时不会调用dashboard
函数?我根据Evan的回答修改了我的代码。
我的应用程序模板现在看起来像这样:
{{#if isAuthenticated}}
<h1>Authenticated</h1>
{{outlet}}
{{else}}
<h1>Unauthenticated</h1>
{{outlet}}
{{/if}}
当用户登陆应用程序页面时,由于他未经过身份验证,因此它是未经身份验证的块。除了没有任何内容呈现在{{outlet}}
标记...
但是当我的应用程序模板看起来像这样时(=没有条件标签):
<h1>Unauthenticated</h1>
{{outlet}}
......它有效!所以我想知道是否可以在条件标签之间插入{{outlet}}
标签。
答案 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)