4

在我的应用程序中,我正在显示消息的时间线。我们按时间降序从服务器检索它们,从最新到最旧。

3 - Howdy
2 - Greetings
1 - Mahalo

我们的用户还可以添加一条新消息,默认情况下该消息会插入到队列的末尾,如下所示

3 - Howdy
2 - Greetings
1 - Mahalo
4 - I'm the new message, last as usual

当我提交时,我希望新消息显示在顶部。我之前写了一个函数来反转项目数组,但这不适用于已经在数组中的项目。

4 - I'm the new message, first finally
3 - Howdy
2 - Greetings
1 - Mahalo

在这种情况下,最好的方法是什么?理想的情况是 Ember Data 预先添加到内容数组而不是追加。还有其他可能更好的选择吗?

4

2 回答 2

5

对于大多数涉及排序的场景,建议使用它Ember.SortableMixin,它被烘焙到Ember.ArrayController.

请参考 JSFiddle 中的这个概念示例:http: //jsfiddle.net/schawaska/tbbAe/

在此示例中,模型有一个DateTime名为 的字段when,我将其用于过滤:

App.Greeting = DS.Model.extend({
    text: DS.attr('string'),
    when: DS.attr('date')                  
});

App.Greeting.FIXTURES = [
    {id: 1, text: 'First', when: '3/4/2013 2:44:52 PM'},
    {id: 2, text: 'Second', when: '3/4/2013 2:44:52 PM'},
    {id: 3, text: 'Third', when: '3/4/2013 2:44:52 PM'},
    {id: 4, text: 'Fourth', when: '3/4/2013 3:44:52 PM'}
];

在控制器中我唯一要做的就是设置属性的名称和排序方向:

App.SortingMixinController = Em.ArrayController.extend({
    sortProperties: ['when'],
    sortAscending: false
});

然后在我的 Handlebars 模板中,我可以{{each}}像往常一样使用助手。

因为在这个示例中,除了Forth (因为排序首先出现)之外,所有日期都是相同的,而且因为SortableMixin,这些值将通过另一个属性进行排序 - 我在这里假设 Id。

我在那个小提琴中采用的另一种方法是使用计算属性。我不太确定这种方法,因为它似乎消耗更多资源并且其中的代码App.SortingPropertyController值得一笑,但有点显示可能性。

于 2013-03-05T22:22:28.797 回答
-4

您可以使用基本的 JavaScript 将新项目放入数组中的给定位置吗?不确定这是基本的 ajax + js 对象还是完整的 ember-data 模型,但这适用于简单的 js 数组示例

 var arr = [];
 arr[0] = "Jani";
 arr[1] = "Hege";
 arr[2] = "Stale";
 arr[3] = "Kai Jim";
 arr[4] = "Borge";

 console.log(arr.join());
 arr.splice(2, 0, "Lene");
 console.log(arr.join());

上面代码的输出将是:

Jani,Hege,Stale,Kai Jim,Borge
Jani,Hege,Lene,Stale,Kai Jim, Borge
于 2013-03-04T21:20:51.600 回答