サーバーへの呼び出しを保存したいので、現在オプションを使用Model.save()
して送信しています。patch
changedAttributes()
属性を削除して、新しい属性を追加したいと考えています。Model.set()
/は、上記の/スキームでは使用できないように毎回unset()
変更します。changedAttributes()
Model.save()
patch
Model.set()
設定を解除したい値と、設定したい値を設定したオブジェクトを単純に呼び出して渡したいと思いundefined
ます。
私ができる方法はありunset()
ますset()
かchangedAttributes()
?それともchangedAttributes()
、一連の操作を組み合わせて を決定しますか?
// Currently
var m = new Backbone.Model({ "foo": "bar" });
m.unset("foo");
console.log(m.changedAttributes()); // { "foo": undefined }
m.set("baz", "bar");
console.log(m.changedAttributes()); // { "baz": "bar" }
console.log(m.attributes); // { "baz": "bar" }
// At this point, how do I get the combination of changed attributes? something like: { "foo": undefined, "baz": "bar" }?
// Is that even possible? Am I doing something horribly wrong?
//================================================================
// What (I think) I want is for Model.set() to remove attributes with values of undefined, so I only have to make one call and changedAttributes() will be pristine. Maybe with a option or something?
var w = new Backbone.Model({ "foo": "bar" });
w.set({ "foo": undefined, "baz": "bar" });
console.log(w.changedAttributes()); // { "foo": undefined, "baz": "bar" }
console.log(w.attributes); // I would like it to be { "baz": "bar" }, "foo" having been removed in the set() call.
//================================================================
// I was trying to avoid processing the objects by hand. I realize that I can do something like the following.
var h = new Backbone.Model({ "foo": "bar" });
var changes = { "foo": undefined, "baz": "bar" };
_.each(changes, function(val, key) {
if (_.isUndefined(val)) {
h.unset(key, { "silent": true });
} else {
h.set(key, val, { "silent": true });
}
});
h.trigger('change'); // Trigger a change event after all the changes have been done.
console.log(changes); // { "foo": undefined, "baz": "bar" }
console.log(h.attributes); // { "baz": "bar" }
上記のコードのフィドル: http://jsfiddle.net/clayzermk1/AmBfh/
このトピックについては、約 1 年前にいくつかの議論があったようですhttps://github.com/documentcloud/backbone/pull/879。私が欲しかった機能は、ある時点で存在していたようです。
編集: @dennis-rongo が指摘したように、これは明らかに手動で行うことができます。上記の私の質問を言い換えると、「Backbone では属性を一度に設定/削除できますか?」そうでない場合、その決定の背後にある理論的根拠は何ですか? Derick Bailey は、属性の状態を処理する Backbone.Memento ( https://github.com/derickbailey/backbone.memento ) を作成しました。このシナリオに密接に関連するモデルの状態に関する Backbone には、いくつかの問題があります ( https://github.com /documentcloud/backbone/pull/2360、ある程度関連: https://github.com/documentcloud/backbone/issues/2316、非常に関連: https://github.com/documentcloud/backbone/issues/2301 )。
編集 2:私は手巻きのソリューションを探しているわけではありません。多かれ少なかれ、私が望むことを行うことができます (上記のサンプル コードを参照)。この一般的なシナリオの明確な例を使用して、現在の設計の正当化を探しています-一度に設定および設定解除します。
更新: https://github.com/documentcloud/backbone/issues/2301で、この件についていくつかの会話がありました。現在の実装についての議論を促すために、プル リクエスト ( https://github.com/documentcloud/backbone/pull/2368 ) を送信しました。
回答を投稿してくれたすべての人に感謝します!