Login 为什么我的Ember.js出口有时无法有条件地呈现?
我正在尝试实现一个非常基本的登录表单。我有这个:Login 为什么我的Ember.js出口有时无法有条件地呈现?,login,ember.js,conditional,outlet,Login,Ember.js,Conditional,Outlet,我正在尝试实现一个非常基本的登录表单。我有这个: <script type="text/x-handlebars" data-template-name="application"> {{#if userIsLoggedIn}} {{outlet}} {{else}} {{partial "login"}} {{/if}} </script> <script type="text/x-handlebars"
<script type="text/x-handlebars" data-template-name="application">
{{#if userIsLoggedIn}}
{{outlet}}
{{else}}
{{partial "login"}}
{{/if}}
</script>
<script type="text/x-handlebars" data-template-name="_login">
<div>Username: {{input value=username type="text"}}</div>
<div>Password: {{input value=password type="password"}}</div>
<button {{action 'logIn'}}>l o g i n</button>
</script>
{{#如果userIsLoggedIn}
{{outlet}}
{{else}
{{部分“登录”}
{{/if}
用户名:{{input value=Username type=“text”}
密码:{{input value=Password type=“Password”}
l o g i n
登录操作将更新userIsLoggedIn
当第一次加载时,它会按预期显示登录表单
当我登录时,登录表单会消失,正常的东西会像预期的那样呈现到outlet中
在其他地方,我有一个注销按钮,可以将userIsLoggedIn更改为false。当我按下这个按钮时,正常的东西消失了,登录表单重新出现,正如预期的那样
在这一点上,一切看起来就像它在第一次加载。但是如果我再次登录,我会得到一个空白页面。为什么?
我想也许我不应该在if区内有插座。但是如果我把它拔出来,我必须通过在其他地方复制userIsLoggedIn检查来阻止它被使用。我找不到一个地方可以放重复的支票来产生我想要的行为。ApplicationRoute.renderTemplate()似乎是一个很自然的地方,但我尝试了很多方法,但都没有想出任何方法,只需一次登录状态检查就可以打开和关闭我的整个outlet层次结构(大多数未在上面显示)。您是否尝试过使用登录路由,如果他们在到达某个路由时没有登录,您会阻止该路由,然后在他们登录后重试
J奎格利,看看这把小提琴:。我相信这是你想要的方式 我试着为你的小提琴失败的原因写一个解释,但我不太了解新路由器的内部结构,所以对我的答案没有信心。我相信tl;dr是指: 不要将
{{outlet}}
放入可以在当前路由中更改的条件中
正如Daniel所建议的,我提供的JSFIDLE用一个单独的路由代替了条件路由。基本上,重要的一点是确保依赖于正在验证的用户的路由层次结构与登录路由层次结构分开,以避免通过缓存路由处理程序意外跳过检查。这没有什么问题。。你能摆弄一下你已经做了什么吗?是的,这里有一个简单的例子(实际的身份验证被撕掉了,所以你不需要输入用户名或密码):我假设你说的是“如何重定向到身份验证路由的登录表单”部分。不,我没试过。如果这不起作用,我会试试看。多亏了hjdivad,我现在明白了我不应该做我正在做的事情。他的回答很好地回答了我提出的问题,但我也有一个迄今为止未提及的议程,即在Ember通过登录过程分流用户时,试图阻止它干扰URL,因此我需要缓存替换的转换,并在登录后重试。因此,这确实是我的正确答案。