19 сент. 2012 г., 03:44 отpjmorselouiscoquio

Сортировать содержимое ArrayController

У меня естьEmber.ArrayController с несортированным содержимым.

Я хочу знать, возможно ли отсортировать содержимое ArrayController без использования нового свойства.

Конечно, я могу создать новое свойство:

<code>App.MyArrayController = Em.ArrayController.extend({
  mySortMethod: function(obj1, obj2) {
    // some code here
  },
  updateSortedContent: function() {
    var content = this.get('content');
    if (content) {
      var sortedContent = content.copy();
      sortedContent.sort(this.mySortMethod);
      this.set('sortedContent', sortedContent);
    }
  }.observes('content')
});
</code>

Но я надеюсь, что есть лучший способ, который не дублирует контент.

Ответы на вопрос(2)

10 июл. 2012 г., 01:40 отatamanroman

ОБНОВИТ

В последней версии Ember встроена сортировка.ArrayController теперь включает в себяEmber.SortableMixin который будет задействован, если вы укажетеsortProperties (Массив) и, необязательно,sortAscending (Логическое).

Примечание: с новым SortableMixin вам все еще нужно обратиться кarrangedContent чтобы получить отсортированную версию. Сама модель останется нетронутой. (Спасибо Джонатану Трану

App.userController = Ember.ArrayController.create({
  content: [],
  sortProperties: ['age'],
  sortAscending: false
})

ОРИГИНАЛЬНЫЙ ОТВЕТ

Правильный способ сделать это - использоватьarrangedContent свойство ArrayProxy. Это свойство предназначено для переопределения для предоставления отсортированной или отфильтрованной версии массива содержимого.

App.userController = Ember.ArrayController.create({
  content: [],
  sort: "desc",
  arrangedContent: Ember.computed("content", function() {
    var content, sortedContent;
    content = this.get("content");
    if (content) {
      if (this.get("sort") === "desc") {
        this.set("sort", "asc");
        sortedContent = content.sort(function(a, b) {
          return a.get("age") - b.get("age");
        });
      } else {
        this.set("sort", "desc");
        sortedContent = content.sort(function(a, b) {
          return b.get("age") - a.get("age");
        });
      }
      return sortedContent;
    } else {
      return null;
    }
  }).cacheable()
});
08 мая 2012 г., 13:42 отRoy Daniels

включая содержимое любого контроллера массива, в Ember. Вы всегда можете заменитьcontent с вашим отсортированным массивом вместо хранения обоих массивов.

Обновит

Вот пример того, что, я думаю, ты ищешь:http: //jsfiddle.net/ud3323/yjs8D

Обновление # 2

Обновлен этот пример, чтобы использовать новые изменения контекста представления.https: //gist.github.com/249496

Рули

<script type="text/x-handlebars" >
Will Display and Sort by Age (after 2 sec)<br/><br/>

{{#each App.userController}}
    {{#view App.RecordView}}
        {{name}} - {{age}}
    {{/view}}
{{/each}}
</script>

JavaScript

App = Ember.Application.create({
    ready: function() {
        Ember.run.later(this, function() {
            Ember.run.later(this, function() {
                App.get('userController').set('content', [
                   Ember.Object.create({ name:"Jeff", age:24 }),
                   Ember.Object.create({ name:"Sue", age:32 }),
                   Ember.Object.create({ name:"Jim", age:12 })
               ]);
      }, 2000);
        Ember.run.later(this, function() {
            // Make the controller's content sort again in reverse this time
            App.userController.notifyPropertyChange('content');
        }, 4000);
    }
});

App.userController = Ember.ArrayController.create({
    content: [],

    contentDidChange: Ember.observer(function(userCtr, prop) {
        if(!Ember.empty(this.get('content'))) {
            console.log('about to begin sort');
            this.sortContent();
        }

        this._super();
    }, 'content'),

    sort:"desc",

    sortContent:function() {
        var content = this.get("content"), sortedContent;

        if (this.get("sort") == "desc") {
            this.set("sort", "asc");
            sortedContent = content.sort( function(a,b){
                return a.get("age") - b.get("age");
            });
        } else {
            this.set("sort","desc");
            sortedContent = content.sort( function(a,b){
                return b.get("age") - a.get("age");
            });
        }

        this.set("content",sortedContent);
    }
});

App.RecordView = Ember.View.extend({});

ВАШ ОТВЕТ НА ВОПРОС