Ember.js在转换到不同路由时持久化classNameBindings

时间:2014-05-13 15:35:01

标签: ember.js

我对ember很新,我一直试图解决这个问题几天但我似乎无法在网上找到解决方案。

我有一个包含所有帖子列表的页面,每个帖子都有一个标签(如标签),“健身”,“知识”或“社交”。在页面的顶部,我有3个视图助手,每个视图助手代表一个标签(健身,知识或社交)。这些将用于过滤掉具有该特定标记名称的帖子。

我的问题是,当我点击视图助手时,我将“isSelected”属性切换为true,这会通过classNameBindings添加“isSelected”类。但是当我转移到网站上的不同路线并返回时,“isSelected”属性将重置为false并且“isSelected”类已被删除。当我重新访问这条路线时,如何保持这些值的持续性和完整性?

这是我的代码:

<script type="text/x-handlebars" data-template-name="global">
<ul class="categories">
<li>{{view App.Tag class="label fitness" text="fitness"}}</li>
<li>{{view App.Tag class="label knowledge" text="knowledge"}}</li>
<li>{{view App.Tag class="label social" text="social"}}</li>
</ul>
</script>

查看:

        "use strict";

 App.Tag = Ember.View.extend({

    tagName: 'span',

    template: Ember.Handlebars.compile('{{view.text}}'),

    classNames: ['label'],

    classNameBindings: ['isSelected'],
    isSelected: false,

    click: function () {
        this.toggleProperty('isSelected');
    }
});

我也尝试过使用带有操作的控制器,但这种方式保留了“isSelected”属性,但在重新访问路径时没有保留类的添加。

1 个答案:

答案 0 :(得分:1)

这可能不太理想,但是为了保存应用程序的状态,可以将状态置于控制器中。您可能有一个简单的实现,但可能没有将isSelected指定为属性。以下工作,您可以查看jsbin here

App = Ember.Application.create();

App.Router.map(function() {
  this.route('global');
});

App.IndexRoute = Ember.Route.extend({
  model: function() {
    return ['red', 'yellow', 'blue'];
  }
});

App.GlobalController = Ember.Controller.extend({
  activeTags: Ember.A()
})

App.Tag = Ember.View.extend({

  tagName: 'span',

  template: Ember.Handlebars.compile('{{view.text}}'),

  classNames: ['label'],

  classNameBindings: ['isSelected'],

  isSelected: function () {
    console.log("ON CHANGE", this.get('controller.activeTags'));
    return this.get('controller.activeTags').contains(this.text);
  }.property('controller.activeTags.@each'),

  click: function () {
   var tagArray = this.get('controller.activeTags');
   if (tagArray.contains(this.text))
     this.set('controller.activeTags', tagArray.without(this.text))
   else
     tagArray.pushObject(this.text);
  }

});