8

我有Ember.ArrayController一个未分类的内容。

我想知道是否可以在不使用新属性的情况下对 ArrayController 的内容进行排序。

我当然可以创建一个新属性:

App.MyArrayController = Em.ArrayController.extend({
  mySortMethod: function(obj1, obj2) {
    // some code here
  },
  updateSortedContent: function() {
    var content = this.get('content');
    if (content) {
      var sortedContent = content.copy();
      sortedContent.sort(this.mySortMethod);
      this.set('sortedContent', sortedContent);
    }
  }.observes('content')
});

但我希望有更好的方法不重复内容。

4

2 回答 2

35

更新

最新版本的 Ember 实际上内置了排序功能。ArrayController现在包括如果您指定(Array) 和可选的(Boolean)Ember.SortableMixin将参与的排序。sortPropertiessortAscending

注意:使用新的 SortableMixin,您仍然需要参考才能arrangedContent获得排序后的版本。模型本身将保持不变。(感谢乔纳森·特兰)

App.userController = Ember.ArrayController.create({
  content: [],
  sortProperties: ['age'],
  sortAscending: false
})

原始答案

正确的做法是使用arrangedContentArrayProxy 的属性。此属性旨在被覆盖以提供内容数组的排序或过滤版本。

App.userController = Ember.ArrayController.create({
  content: [],
  sort: "desc",
  arrangedContent: Ember.computed("content", function() {
    var content, sortedContent;
    content = this.get("content");
    if (content) {
      if (this.get("sort") === "desc") {
        this.set("sort", "asc");
        sortedContent = content.sort(function(a, b) {
          return a.get("age") - b.get("age");
        });
      } else {
        this.set("sort", "desc");
        sortedContent = content.sort(function(a, b) {
          return b.get("age") - a.get("age");
        });
      }
      return sortedContent;
    } else {
      return null;
    }
  }).cacheable()
});
于 2012-07-10T02:40:00.497 回答
2

您必须在 Ember 中手动对数组进行排序,包括任何数组控制器的内容。你总是可以content用你的排序数组替换而不是保留两个数组。

更新

这是我认为您正在寻找的示例:http: //jsfiddle.net/ud3323/yjs8D/

更新#2

更新了此示例以使用新的视图上下文更改。https://gist.github.com/2494968

车把

<script type="text/x-handlebars" >
Will Display and Sort by Age (after 2 sec)<br/><br/>

{{#each App.userController}}
    {{#view App.RecordView}}
        {{name}} - {{age}}
    {{/view}}
{{/each}}
</script>

JavaScript

App = Ember.Application.create({
    ready: function() {
        Ember.run.later(this, function() {
            Ember.run.later(this, function() {
                App.get('userController').set('content', [
                   Ember.Object.create({ name:"Jeff", age:24 }),
                   Ember.Object.create({ name:"Sue", age:32 }),
                   Ember.Object.create({ name:"Jim", age:12 })
               ]);
      }, 2000);
        Ember.run.later(this, function() {
            // Make the controller's content sort again in reverse this time
            App.userController.notifyPropertyChange('content');
        }, 4000);
    }
});

App.userController = Ember.ArrayController.create({
    content: [],

    contentDidChange: Ember.observer(function(userCtr, prop) {
        if(!Ember.empty(this.get('content'))) {
            console.log('about to begin sort');
            this.sortContent();
        }

        this._super();
    }, 'content'),

    sort:"desc",

    sortContent:function() {
        var content = this.get("content"), sortedContent;

        if (this.get("sort") == "desc") {
            this.set("sort", "asc");
            sortedContent = content.sort( function(a,b){
                return a.get("age") - b.get("age");
            });
        } else {
            this.set("sort","desc");
            sortedContent = content.sort( function(a,b){
                return b.get("age") - a.get("age");
            });
        }

        this.set("content",sortedContent);
    }
});

App.RecordView = Ember.View.extend({});

​</p>

于 2012-05-08T14:42:39.763 回答