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