2

Ember.SortableMixin

ナチュラルソート

4

4 に答える 4

3

私のプロジェクトで行ったことは、ミックスインの orderBy 関数をオーバーライドすることです ( https://github.com/emberjs/ember.js/blob/master/packages/ember-runtime/lib/mixins/sortable.js #L52 )、Ember.compare() をこの自然な並べ替えアルゴリズムに置き換えます: https://github.com/overset/javascript-natural-sort

orderBy: function (item1, item2) {
  var result = 0,
    sortProperties = this.get('sortProperties'),
    sortAscending = this.get('sortAscending');

  Ember.assert("you need to define `sortProperties`", !!sortProperties);

  sortProperties.forEach(function (propertyName) {
    if (result === 0) {
      naturalSort.insensitive = true;
      result = naturalSort(Ember.get(item1, propertyName), Ember.get(item2, propertyName));
      if ((result !== 0) && !sortAscending) {
        result = (-1) * result;
      }
    }
  });

  return result;
}

sortable mixin に任意のソート機能をプラグインしやすくするために PR を作成しましたが、クローズされました。詳細はこちら:

https://github.com/emberjs/ember.js/pull/1216 https://github.com/emberjs/ember.js/pull/1562

于 2013-03-02T14:09:30.150 に答える
2

追加の「自然」プロパティを定義する必要があります

App.Group = DS.Model.extend                                  
  name: DS.attr 'string'                                             
  natural_name: ( ->                                                
    # Split string into numeric and non-numeric parts
    # and convert numeric parts to actual numbers
    # Sort by resulting array of strings and numbers
    @get('name').split(/([0-9]+)/g).map (str) =>                     
      if str.match(/[0-9]+/) then parseInt(str, 10) else str         
  ).property('name')    



App.GroupsIndexController = Ember.ArrayController.extend
  sortProperties: ['natural_name']
于 2013-02-27T21:18:16.523 に答える
1

If you want to use the SortableMixin you can do it like this:

childrenSorted: function() {
  return Ember.ArrayProxy.createWithMixins(Ember.SortableMixin, {
    sortProperties: ['name'],
    content: this.get('model.children')
  });
}.property('model.children.@each.name')
于 2013-03-01T02:09:57.017 に答える
0

Ember Data 1.0 の時点 (およびおそらくそれ以前) では、以下を使用することをお勧めしますEmber.computed.sort

http://emberjs.com/api/#method_computed_sort

于 2013-09-23T00:07:37.573 に答える