Ember对可枚举数组进行排序或将新对象添加到常规数组中

时间:2014-06-12 15:33:11

标签: javascript jquery arrays sorting ember.js

我有一个待办事项清单 主模板有输入新的待机和插座的输入 插座用于显示每个待办事项的todos.index模板。我已经使用jquery sortable使它们变为srtable。我使用模型属性对它们进行排序。

todos route:

 model: function(){
        return this.store.filter("todo", {}, function(todo){
            if(todo.get("user") !== null && parseInt(todo.get("user").get("id")) === user_id)
                return todo;
        });

todos index route:

model: function(){
    return this.modelFor('todos').sortBy('idx');
}

控制器:

App.TodosController = Ember.ArrayController.extend();    

App.TodosIndexController = Ember.ObjectController.extend();   

但是当我添加这个.sortBy()方法时,我返回的对象数组不再存在,我创建的任何新待办事项都没有添加到模板中。 (它们确实被创建并且在ember数据和我的数据库中,但它们只是没有添加到模板中) - 当你进行sortBy时,实时数组的ember数据被复制到一个不可改变的常规数组中。
 如果我省略sortBy(),我的新对象就可以填充我的模板了。

关于如何对数组进行排序但保持其数据或如何刷新模板的任何想法?

sortProperties不起作用 - 我不知道为什么。我的todos列表由objectController填充。

编辑 -

我的问题是我自己的错。我以为我有这个

 App.TodosIndexController= Ember.ObjectController.extend();    

但我实际拥有的是:

 App.TodoController = Ember.ObjectController.extend();    

这让我没有明确的控制器为我做排序,所以对我来说解决方案是创建一个新的arrayController:

 App.TodosIndexController= Ember.ObjectController.extend();    

并使用它来进行排序。虽然它不是我的问题的解决方案,但我的问题是我自己的遗忘,这是对项目进行排序的正确方法,所以我要将@Kingpins的答案标记为正确。

1 个答案:

答案 0 :(得分:1)

使控制器排序,并遍历模板中的控制器(而不是模型)。

App.TodosIndexController = Ember.ArrayController.extend({
  sortProperties: ['idx'],
  sortAscending: true
});

将模型返回到modelFor

model: function(){
    return this.modelFor('todos');
}

或者您可以在控制器上创建计算属性并观察模型的更新,更新计算属性

App.TodosIndexController = Ember.ArrayController.extend({
  sortedTodos: function(){
    return this.get('model').sortBy('idx');
  }.('model.[]')
});

再次将模型返回到modelFor

model: function(){
    return this.modelFor('todos');
}

手动更新模板的另一种方法是获取TodosIndexController的模型并手动使用pushObject向其中添加新的待办事项。它只是一系列项目。