2

次の2つのモデルがあります。

App.City = DS.Model.extend({
    cityId: DS.attr('number'),
    name: DS.attr()
});

App.Country = DS.Model.extend({
    countryId: DS.attr('number'),
    name: DS.attr()
});

そして、都市の備品は次のようになります。

App.City.FIXTURES = [
    { id: 1, name: 'Dallas', cityId: 1 },
    { id: 2, name: 'Waco', cityId: 2 },
    { id: 3, name: 'Waco', cityId: 2 },
    { id: 4, name: 'Nashville', cityId: 3 },
    { id: 5, name: 'Norfolk', cityId: 4 }
];

私のリストは次のようになります。

  • ダラス (削除)
  • ウェイコ (削除)
  • ウェイコ (削除)
  • ナッシュビル (削除)
  • ノーフォーク (削除)

リストをcityIdでグループ化し、名前でソートしたい:

  • 1x ダラス (削除)
  • 1x ナッシュビル (削除)
  • 1x ノーフォーク (削除)
  • 2x Waco (削除)

ユーザーが Waco の横にある [削除] をクリックすると、2x が 1x に変わり、Waco レコードの 1 つがストアから削除されます。ユーザーがもう一度 [削除] をクリックすると、リストから Waco が削除され、最後の Waco レコードがストアから削除されます。

同じビューに 2 つの異なるリストがあり、各リスト (グループ化およびソート) で同じ動作が必要です。

これが私が今持っているコードです: http://jsfiddle.net/cLNJj/1/

4

1 に答える 1

2

これが、あなたがやりたいことで更新されたJSBinです: http://jsfiddle.net/qv8f8/

基本的に、計算されたプロパティを使用して、uniq モデルのみを取得します。ここでそれを見ることができます:

uniqCities: function() {
    var cities = this.get('content');
    var names = cities.mapBy('name');
    var uniqCities = cities.filter(function(item, idx, array) {
        if (names.contains(item.get('name'))) {
            names.removeObject(item.get('name'));
            return true;
        } else {
            return false;
        }
    });
    return uniqCities;
}.property('content'),

そして ObjectController には、現在のモデルが親のコンテンツで繰り返される回数をチェックする count プロパティがあります。

count: function() {
    var cities = this.get('parentController.content'), 
        citiesWithThisName = cities.filterBy('name', this.get('name'));
    return citiesWithThisName.get('length');
}.property('content'),

ご不明な点がございましたら、お気軽にお問い合わせください。


コメントの質問を更新しました:

JSBin を更新して、カウントを変更し、削除されたアイテムを適切に削除しました。ここでの主要な/唯一の変更はmodel.length、uniqCities 計算プロパティの使用でした。自分のコードでそれを行う必要がないことは確かなので、なぜそれが必要なのかは実際にはわかりませんが、フィクスチャアダプターの警告である可能性があります。ここでJS Binをチェックしてください。.

並べ替えについては、別の SO の質問に対するこの回答を確認します。それはあなたを正しい方向に導くはずです。

ああ、それをもう少し再利用可能にするために、そのルートに使用される2つの異なるアレイコントローラーを用意することをお勧めします。そうすれば、uniqueCities/Countries メソッドを持つことができる ArrayController の基本抽象サブクラスを作成し、それを 2 つの新しいコントローラーに使用できます。ただし、それはご自身で判断してください。:)

于 2013-11-11T19:21:01.587 に答える