2013-02-08 36 views
3

我有一個關於Backbone的問題,如何將模型的所有屬性設置爲空?一次取消設置所有屬性的主幹

unsetmodel.unset(attribute, [options]) 
Remove an attribute by deleting it from the internal attributes hash. Fires a "change" event unless silent is passed as an option. 

但是,這只是爲了逐個取消個別屬性的設置。

任何想法?

Gretz,

回答

7

從骨幹站點:

clearmodel.clear([選項])

從模型中移除所有屬性,包括id屬性。 觸發「更改」事件,除非將安靜作爲選項傳遞。

所以我會做這樣的事情:

myModel.clear(); 

如果你想保留的屬性,爲什麼不通過所有這些迭代和手動設置它們?

$.each(this.model.attributes, function(index, value){ 
    // set them manually to undefined 
}); 
+0

我已經試過這個,但是這也抹掉了屬性本身,因爲我因爲未設置的屬性而收到錯誤 – 2013-02-08 12:29:11

+0

@SjaakRusma,所以你想要將所有屬性值設置爲undefined,但保留屬性的鍵哈希? – jevakallio 2013-02-08 12:34:07

+0

我想將所有的屬性設置爲undefined, – 2013-02-08 12:42:05

1

沒有內置的方法來設置所有屬性未定義,同時保留attributes鍵。好消息是,你可以很容易地建立自己一個帶有下劃線一行代碼:

Backbone.Model.prototype.clearValues = function(options) { 
    this.set(_.object(_.keys(this.attributes), []), options); 
} 

所有車型屆時將有一個clearValues方法:

var model = new Model({ 
    id:1, 
    foo:'foo', 
    bar:'bar' 
}); 
model.clearValues(); 

console.log(model.toJSON()); //-> {id: undefined, foo: undefined, bar: undefined} 
3

我知道這是一個古老的職位,但我最近遇到了一個類似的問題 - 主要是,如果你一個一個取消設置,你會得到多個change事件,模型每個都處於中間狀態。爲了讓這種情況發生在隨後發生的適當更改事件中,您必須逐一靜默取消它們,然後在取消設置後爲每個更改事件手動觸發更改事件。但是,如果您查看Backbone代碼,則會看到unset方法實際上只是對set的調用,其中{unset:true}位於選項中。所以你應該能夠做到這一點:

model.set({ attr1: undefined, attr2: undefined, attr3: undefined }, { unset: true }) 

我沒有嘗試過它在實踐中,但它應該在理論上肯定工作。您將得到一系列change事件的每個屬性,所有的unsets已完成。這種方法稍微超出了推薦的路徑,因爲它使用來自Backbone源的未暴露的邏輯,但由於該特定代碼hasn't changed in a few years(在此之前實際上似乎被支持爲set選項),因此使用並繼續是安全的使用。

+0

完美的工作對我來說。感謝你! – jkinz 2016-06-08 16:50:33