2013-02-06 27 views
1

我一直在尝试使用Rails/Ember pre-4来做一个相当典型的事情,那就是有一个带导航栏和内容部分的页面。导航栏仅在登录时发生变化(登录时显示注销按钮,注销时显示登录和注册按钮),而不是每次更改页面。根据登录状态更改导航栏

起初以为我能做到在application.hbs模板的东西,如:

{{视图导航栏}} {{口}}

在哪里设置导航栏响应登录状态变化(由国家经理管理)。这似乎没有工作。

然后我试图像(也application.hbs):

{{出口导航栏}} {{出口}}

,并试图在每个路由,这导致大量的设定导航栏也没有最终的工作。

在发布代码之前,想知道是否有人已经对这种常见情况有了很好的解决方案,其中页面的某些部分(如导航栏或侧栏)仅在应用程序状态发生某些更改时发生更改,而不是每次发生页面更改。

回答

2

有很多方法可以做到这一点。你描述的第一种方法与我们正在做的最接近。在过去的版本中,我们使用了view helper来实现这一点,今天我们使用{{render}},但它的基本概念相同。例如,application.hbs可能是这样的:

{{render navbar}} {{outlet}} 

现在navbar.hbs可以用一个简单的{{#if}}助手交换基于登录状态的链接。

<div class="navbar"> 
    <div class="navbar-inner"> 
    {{#linkTo index class="brand"}}My App{{/linkTo}} 
    <ul class="nav"> 
     <li>{{#linkTo index}}Home{{/linkTo}}</li> 
     <li>{{#linkTo about}}About{{/linkTo}}</a></li> 
    </ul> 
    <ul class="nav pull-right"> 
    {{#if isAuthenticated}} 
    <li><a {{action logout}} href="#">Logout</a></li> 
    {{else}} 
    <li><a {{action login}} href="#">Login</a></li> 
    {{/if}} 
    </ul> 
    </div> 
</div> 

现在我们向追踪和管理登录状态的NavbarController添加逻辑。

App.NavbarController = Ember.ArrayController.extend({ 
    isAuthenticated: false, 
    login: function() { 
    this.set('isAuthenticated', true); 
    }, 
    logout: function() { 
    this.set('isAuthenticated', false); 
    } 
}); 

真正应用NavbarController将代理这些请求到另一个控制器,也许currentUserController。我在这里创建了一个工作示例:http://jsbin.com/iyijaf/6/edit

+0

太好了,谢谢。我在一个州长的帮助下扩展了你的例子,并按预期工作http://jsbin.com/exidil/2/edit – mmadrid99

+1

这是一个很好的例子。然而,我试图进一步,并在我的索引视图中使用相同的状态管理器有条件。我问这是一个单独的问题:http://stackoverflow.com/questions/16267557/ember-statemanager-doesnt-work-after-changing-twice – Ben