1

プロパティを持つUserエンティティがありsubscriptionsます。これは ID の配列です。

フェッチを実行すると、API はそれらを入力し、次のsubscriptionsようなものを返します。

{
  subscriptions: [1, 2, 3],
  __subscriptions: [
    {
      id: 1,
      name: 'Example'
    },
    {
      id: 2,
      name: 'Example'
    },
    {
      id: 3,
      name: 'Example'
    }
  ]
}

これを行ったのは、元のアクションに対して引き続きアクションを実行し、subscriptionsそれらを API に保存できるようにするためです。__subscriptionsAPI はこのフィールドを認識しないため、私が行った変更は永続化されません。これは単に入力されたデータです。

myのparse関数でUser、ネストされたコレクションを作成します。

parse: function (response) {
  this.subscriptions = new Subscriptions(response.__subscriptions)
}

ただし、サブスクリプションを削除する場合subscriptionsは、エンティティのフィールドからそれをスプライスする必要があります。次に、プロパティとしてネストされている収集されたUserものからも削除する必要があります。subscriptionsUser

// Clone the subscriptions property, delete the model with a matching ID, and then set it again.
var value = _.clone(this.get('subscriptions'))

// Use splice instead of delete so that we don't leave an undefined value
// in the array
value.splice(value.indexOf(model.id), 1)

// Also remove the same model from the nested collection
var removedSubscription = this.subscriptions.get(model)
this.subscriptions.remove(removedSubscription)

this.set('subscriptions', value)
this.save()

これはちょっと面倒です。理想的には、subscriptionsプロパティから ID を削除すると、コレクションが自動的に更新されます。

これは、ネストされたモデルとコレクションを処理するための良い方法のように思えますか? Backbone.Relational について悪いことを聞いたので、より簡単なソリューションに興味がありました。

4

1 に答える 1

2

Subscriptions コレクションのイベントをリッスンし、それに応じて subscriptions 引数を更新します。

var User = Backbone.Model.extend({

  initialize: function () {
    this.subscriptions = new Subscriptions;
    this.subscriptions.on('add remove', this.updateSubscriptions, this)
  },

  updateSubscriptions: function() {
    this.set('subscriptions', this.subscriptions.pluck('id'))
  },

  parse: function (response) {
    this.subscriptions.reset(response.__subscriptions);
    return Backbone.Model.parse.call(this, response);
  }

});

subscriptionsしたがって、サブスクリプションを削除すると、ユーザー モデルの属性が更新されます。

user.subscriptions.remove(subscription)
于 2013-05-05T10:37:30.087 に答える