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

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

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

Будет рендеринг этой модели с использованием #each, но это должно сделать итерацию на основе свойства sortOrder, а не свойства идентификатора модели.

Ответ 1

В 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' выглядит эквивалентно мне. Все три вычисленные выше свойства создают один и тот же отсортированный список.

Обратите внимание, что вы не можете заменить аргумент 'sortProps' 'lastName' в sortedUsers1,2 - он не будет работать.

Чтобы изменить порядок сортировки, измените sortProps на

sortProps: ['lastName:desc']

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

В шаблоне использование будет таким, как ожидалось:

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

Ответ 2

Вот как я вручную сортирую (используя сравнение ember)

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("[email protected]")
});

Ответ 3

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

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

Вот рабочая демонстрация.

Ответ 4

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

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

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

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

Так: JSBin