8

ArrayController残り火データクエリからコンテンツが発生するものを並べ替えることができるようにしたいと思います。残念ながら、sortPropertyこの場合、ミックスインは機能しないようです。

次のことができるようになりたいです。

App = Ember.Application.create();
App.store = DS.Store.create({ revision: 4});

App.Item = DS.Model.extend({
    id: DS.attr('string'),
    name: DS.attr('string')
});

App.store.createRecord(App.Item, {id: '4', name: 'banana' });
App.store.createRecord(App.Item, {id: '2', name: 'apple'});
App.store.createRecord(App.Item, {id: '6', name: 'spaghetti'}); 

App.ItemsController = Ember.ArrayController.create({
    content: App.store.findAll(App.Item),
    sortProperties: ['name']
});

の最新バージョンEmberとEmber-dataを使用すると、次の出力が得られます。

[ id: 4, name: banana ]

[ id: 2, name: apple ]

[ id: 6, name: spaghetti ]

ここでの問題は、コンテンツプロパティが単なるインスタンスの配列ではない(この場合、コンテンツは[2、3、4])をApp.store.findAll()返すことです。RecordArrayApp.Item

実際にインスタンスを入手するには、のようなものを使用する必要がありますobjectAt()App.Itemしかし、からインスタンスを抽出RecordArrayして通常の配列にダンプしても、期待どおりに機能しません。

これを行うための明白な方法が欠けていますか、それともこれはフレームワークの現在の状態にすぎませんか?ソートするためだけに、すべてのモデルをプレーンオブジェクトとして複製する必要はありません。

編集:

私は自分のカスタムを作成することで問題を回避しましたArrayController。それでも、上記のように機能すればいいのですが。

編集#2:

オリジナルのハンドルバーテンプレート:

<script type="text/x-handlebars">
    {{#each App.ItemsController.content }}
        <p>[ id: {{id}}, name: {{name}} ]</p>
    {{/each}}
</script>

(また、上記のコードsortPropertyの代わりにプロパティを使用していsortPropertiesましたが、それは単なるタイプミスでした。)

はい、代わりに使用する場合

<script type="text/x-handlebars">
    {{#each App.ItemsController.arrangedContent }}
        <p>[ id: {{id}}, name: {{name}} ]</p>
    {{/each}}
</script>

次に、必要なものを正確に取得します。

[ id: 2, name: apple ]

[ id: 4, name: banana ]

[ id: 6, name: spaghetti ]
4

4 に答える 4

11

私も同じ問題を抱えていました。しばらく時間がかかりましたが、最終的にこの一般的な解決策で解決しました。

App.ArrayController = Ember.ArrayController.extend({
  sortProperties: ['id'],
  sortAscending: true,

  sortedContent: (function() {
    var content;
    content = this.get("content") || [];
    return Ember.ArrayProxy.createWithMixins(Ember.SortableMixin, {
      content: content.toArray(),
      sortProperties: this.get('sortProperties'),
      sortAscending: this.get('sortAscending')
    });
  }).property("content.@each", 'sortProperties', 'sortAscending'),

  doSort: function(sortBy) {
    var previousSortBy;
    previousSortBy = this.get('sortProperties.0');
    if (sortBy === previousSortBy) {
      return this.set('sortAscending', !this.get('sortAscending'));
    } else {
      set('sortAscending', true);
      return this.set('sortProperties', [sortBy]);
    }
  }
});

現在、私のArrayControllerのほとんどは、特にEmber/Dataをコンテンツとして持つもののApp.ArrayController代わりに拡張されています。Ember.ArrayControllerRecordArray

次に、ハンドルバーテンプレートで、次のようにします。

 {{#each item in sortedContent}}
   ...          
 {{/each}}

それ以外の

 {{#each item in content}}
   ...          
 {{/each}}
于 2012-11-15T12:24:28.253 に答える
6

Ember1.1.2およびember-data1.0.0-beta.3以降、おそらくそれ以前では、コントローラーでsortPropertiesを設定するだけで十分です。並べ替える方向に設定することも、それに応じてsortAscending設定することもできます。truefalse

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

ただし、注意してください

sortProperties: ['id']

数値ではなく字句的にソートしているように見えます。created_atタイムスタンプによる字句の並べ替えを回避しましたが、別の方法がある可能性があります。

于 2013-11-07T01:57:09.423 に答える
4

同様の問題が発生し 、sortBy()メソッドを使用したルートの配列クラスのドキュメントを介して分類しました。
だからあなたの場合それは次のようなものかもしれません

App.store.findAll().sortBy('name');

私はこれが古い質問であることを知っていますが、私のような誰かがつまずいた場合に備えてそれに答えます

于 2014-06-11T16:21:27.017 に答える
3

Emberバージョン1.0.0の時点で、rc.4 Ember.ArrayProxy.create(Ember.SortableMixin ....は動作しなくなったようです。Ember.ArrayProxy.createWithMixins(Ember.SortableMixin ....Ember.ArrayControllerに組み込まれている並べ替え機能を使用 または使用します。

于 2013-06-10T18:46:03.347 に答える