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 を想定しています。

そのフィドルで私が取ったもう1つのアプローチは、計算されたプロパティを使用することです。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 に答える