Ember - 如何在管理路径中设置变量

时间:2013-12-02 22:40:09

标签: ember.js routing

我想设置一些状态变量,只有当我在我的app的admin部分(即任何以/ admin开头的url)时,才可以将css类添加到我的标题模板中。我有以下路线:

this.resource('admin', { path: '/admin' }, function() {
    this.route('dashboard', { path: '/' });
    // more admin routes...
}
this.route('user')
// more routes...

以下是我的ApplicationRoute中的setupController

App.ApplicationRoute = App.Route.extend({
    setupController: function(){
        this.controllerFor('header').set('isInAdmin', false);
    }
}

在AdminRoute中也一样:

App.AdminRoute = App.Route.extend({
  setupController: function(){
    this.controllerFor('header').set('isInAdmin', true);
  }
});

这很好但是一旦我导航到管理路由,然后导航回非管理员路由,我不知道如何重置isInAdmin变量。

2 个答案:

答案 0 :(得分:4)

应用程序控制器有computed property名为currentPath。该属性与当前路径相同,例如,转换为admin/dashboard将在currentPath中返回admin.dashboard,转到/foo返回foo等。

因此,您可以使用以下代码了解何时输入管理路由:

App.ApplicationController = Ember.Controller.extend({
    isInAdmin: function() {
        var currentPath = this.get('currentPath');
        // if the first hierarchy is admin, so is a admin route
        return currentPath.split('.')[0] === 'admin';        
    }.property('currentPath')
});

在您的申请模板中isInAdmin将是可用的:

<script type="text/x-handlebars" data-template-name="application">        
    ...
    <div {{bind-attr class=isInAdmin}}>
    ...
    </div>
    ...
</script>

看看这个小提琴,看看这个行动http://jsfiddle.net/marciojunior/j5PRe/

答案 1 :(得分:0)

我刚读过Ember.Route上的deactivate钩子:

http://emberjs.com/api/classes/Ember.Route.html#method_deactivate

  

当路由器完全退出此路由时,将执行此挂接。它   当路线的模型改变时,不会执行。

所以我补充道:

App.AdminRoute = App.Route.extend({
  deactivate: function(){
    this.controllerFor('header').set('isInAdmin', false);
  }
});

也有效,但Márcio的回答可能有点整洁