Как сортировка достигается в модели 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