2011-11-20 83 views
2

這可能是組件濫用的結果,儘管我不這麼認爲。 我有一個問題,視圖更新Backbone JS中的模型,並調用模型的Set方法,以便驗證它的輸入。 從理論上講,這樣的行爲有兩個結果:錯誤和變化。 這兩個事件按照規定工作。 但事實上還有第三個事件:沒有變化。 也就是說,如果輸入完全沒有改變,在調用Set之後我無法判斷,因爲不會發生錯誤,但也不會發生更改事件,因爲實際上沒有發生任何改變 - 但我仍然想知道這樣的案件。 有沒有辦法讓我這樣做?如何判斷Backbone.js中的模型是否未更改?

原因是隻有在沒有錯誤發生時纔會執行某個操作,但是我無法知道(如果沒有更改事件)模型試圖設置新值並且以無因爲這一切都是異步發生的。

謝謝!

回答

8

每個骨幹模型具有hasChanged method

hasChangedmodel.hasChanged([attribute])

自上次"change"事件具有典型的改變?如果屬性已通過,則返回true,如果該特定屬性已更改。

也許你可以用它來檢查你的第三種可能性。

順便說一句,回調不是異步的。錯誤和更改的回調觸發並set returns之前返回:

set : function(attrs, options) { 
    //... 

    // Run validation. 
    if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false; 

    //... 

    // Update attributes. 
    for (var attr in attrs) { 
    var val = attrs[attr]; 
    if (!_.isEqual(now[attr], val)) { 
     now[attr] = val; 
     delete escaped[attr]; 
     this._changed = true; 
     if (!options.silent) this.trigger('change:' + attr, this, val, options); 
    } 
    } 

_performValidation呼叫觸發錯誤回調時,this.trigger通話將調用每個屬性的回調。

+0

謝謝!我的印象是異步的。 我會嘗試使用hasChanged ... –

+0

@Che:任何碰到服務器的東西('sync','save',...)將是異步的,只有在瀏覽器中發生的任何事情都是同步的和順序的。 –

+0

看看上面的代碼。 hasChanged()查找'this._changed',如果不將模型設置爲新值,它將不會被觸及。所以這是行不通的。 – maxl0rd

0

在這種情況下,您可能需要在Model.set()附近跳舞以獲得所需的位置。如果您正在使用此功能,那麼您應該在模型上定義了一個validate()方法。

http://documentcloud.github.com/backbone/#Model-validate

這樣你就可以直接調用此方法...

// something happens and we need to update the model to "newvalues" 
if (model.validate(newvalues)) { 
    model.trigger('error') 
} else { 
    model.trigger('change') 
} 
model.set(newvalues) 

這樣,你總是會至少獲得「變」或「錯誤」出來的,即使是相同的。您仍然可以從設置中獲取現有的事件。

相關問題