Как сортировка достигается в модели Ember без использования контроллера массива?

каждый результат google - это сортировка ArrayController. Нужен механизм сортировки без использования массива.

существует модель, в которой есть параметры сортировки. Как сказать "sortOrder" как одно из свойств в модели (которое будет с заднего конца).

будет отображать эту модель, используя #each, но это должно делать итерацию на основе свойства sortOrder, а не свойства ID модели.

4 ответов


В Ember 2.0 SortableMixin является устаревшим и находится на своем пути.

на Controller (а не ArrayController) вы можете определить новое вычисляемое свойство, например SortedUsers1,2,3 ниже:

export default Ember.Controller.extend({
    sortProps: ['lastName'],
    sortedUsers1: Ember.computed.sort('model', 'sortProps'),
    sortedUsers2: Ember.computed.sort('content', 'sortProps'),
    sortedUsers3: Ember.computed('content', function(){
        return this.get('content').sortBy('lastName');
    })
});

предположение выше заключается в том, что сама модель представляет собой массив пользователей с lastName как одно из свойств пользователя. Зависимость от 'model' и 'content' посмотреть эквивалентны мне. Все три вычисляемых свойства выше производят один и тот же отсортированный список.

обратите внимание, что вы не можете заменить с 'lastName' на sortedUsers1,2 - это не сработает.

изменить порядок сортировки изменить sortProps to

sortProps: ['lastName:desc']

также, если ваш шаблон находится в папке users / index, ваш контроллер также должен быть там. Контроллер в users/не будет делать, даже если модель загрузки маршрута находится в users/.

в шаблоне использование ожидается:

    <ul>
        {{#each sortedUsers1 as |user|}}
            <li>{{user.lastName}}</li>
        {{/each}}
    </ul>

вот как я вручную сортирую (используя Ember compare)

import Ember from "ember";
import { attr, Model } from "ember-cli-simple-store/model";

var compare = Ember.compare, get = Ember.get;

var Foo = Model.extend({
    orderedThings: function() {
        var things = this.get("things");
        return things.toArray().sort(function(a, b) {
            return compare(get(a, "something"), get(b, "something"));
        });
    }.property("things.@each.something")
});

вам просто нужно включить SortableMixin для контроллера или компонента, а затем укажите sortAscending и sortProperties собственность.

Em.Controller.extend(Em.SortableMixin, {
  sortAscending: true,
  sortProperties: ['val']
});

вот рабочая демо.


В таких ситуациях я использую Ember.ArrayProxy С Ember.SortableMixin напрямую.

ArrayProxy обертывает любой другой объект, который реализует Ember.Матрица и / или Эмбер.MutableArray, пересылка всех запросов. Это очень делает полезно для ряда обязательных случаев использования или других случаев, когда возможность замены базового массива полезна.

Так, например, у меня есть свойство контроллера, как например:

sortedItems: function(){
        var items = Ember.ArrayProxy.extend(Ember.SortableMixin).create({content: this.get('someCollection')});
        items.set('sortProperties', ['propNameToSortOn']);
        return items;
}.property()

вот так: JSBin