我想將呼叫保存到我的服務器,所以我目前使用Model.save()
和patch
選項併發送changedAttributes()
。在Backbone.js中使用新的和未定義的值的Model.set()
我想刪除一個屬性並添加一個新屬性。 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/
似乎已經大約一年前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)來嘗試和鼓勵討論當前的實現。
謝謝大家誰發佈了答案!
謝謝你回答丹尼斯。你是在暗示我所尋找的東西根本不在設計中?我正在尋找一組更改(顯然,我在我的例子中傳遞給'set()'的對象就是這樣設置的)和一個修改後的結果對象(當然,我可以像你一樣手工完成)。也許我只是盯着這太久了。 =/ – clayzermk1 2013-03-12 01:04:34
Backbone將整個'Model'發送到服務器是有原因的,因爲在大多數情況下,服務器期望這些屬性存在。除非你的服務器負責刪除未定義或空的屬性?除了我發佈的另一個選項是覆蓋'sync'功能並執行類似於我發佈的檢查。 – 2013-03-12 01:13:14
謝謝。我使用MongoDB作爲我的服務器,雖然它會接受'未定義的值,但對我來說存儲它們並沒有什麼意義。我會看看'sync'覆蓋。乾杯! – clayzermk1 2013-03-12 17:05:41