2

私の簡略化されたモデルは次のようになります。

var model = new Backbone.Model({
  defaults: {
    x: 50,
    y: 50,
    constrain_proportions: true
  },
  initialize: function () {
    // Do stuff to calculate the aspect ratio of x and y
    this.on('change:x', doStuff, this);
    this.on('change:y', doStuff, this);
  },
  doStuff: function () {
    // ...
    if (this.get('constrain_proportions')) {
      var changes = this.changedAttributes();
      // Do stuff to make sure proportions are constrained
    }
  }
});

次のような変更を行っている問題が発生しています。

model.set({
  x: 50,
  y: 60
});

私の方法では、 whenが true に設定されている場合、1 つの属性を変更すると、同じ縦横比を維持しながら、もう 1 つの属性が変更されるdoStuffことを確認したいと考えています。constrain_proportions合わせてアップデートするxy縦横比が変わります。私が直面している問題は、上記のコードを使用してバックボーン モデルを変更すると、x属性がデフォルト値と同じになることです。バックボーンでは、これによりmodel.changedAttributes()以下が返されます。

{ y: 60 }

これは、Model.setメソッド内のこのコードのチャンクによるものです。

// For each `set` attribute, update or delete the current value.
  for (attr in attrs) {
    val = attrs[attr];
    if (!_.isEqual(current[attr], val)) changes.push(attr);
    if (!_.isEqual(prev[attr], val)) {
      this.changed[attr] = val;
    } else {
      delete this.changed[attr]; // The culprit is right here
    }
    unset ? delete current[attr] : current[attr] = val;
  }

x値が 60 に変更されたことに加えて、値が 50 に変更されたことを知らずyに、コードはx値を 60 に更新して、モデルの初期化によって設定された 1:1 のアスペクト比を維持します。を変更{x: 50, y: 60}することで、縦横比を 5:6 に変更したいのですが、Backbone の上記のコードは、変更された値が以前と同じである場合に発生しないようにします。

これをうまく回避するにはどうすればよいですか?

4

1 に答える 1

0

変更イベントを強制したいときは、黙って属性を設定解除してから、再度設定します。

model.unset('x', { silent: true }).unset('y', { silent: true }).set({ x: 50, y: 60 });

より便利にするために、モデルの別の関数でラップできます。

setXY: function(x, y) {
    this.unset('x', { silent: true }).unset('y', { silent: true }).set({ x: x, y: y });
}
于 2013-06-20T20:03:35.883 に答える