私の簡略化されたモデルは次のようになります。
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
合わせてアップデートするx
とy
縦横比が変わります。私が直面している問題は、上記のコードを使用してバックボーン モデルを変更すると、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 の上記のコードは、変更された値が以前と同じである場合に発生しないようにします。
これをうまく回避するにはどうすればよいですか?