2013-04-10 60 views
5

我知道我可以設置Backbone模型屬性的值,以便它不會觸發更改事件使用{silent:true}。我也知道,如果我將模型的屬性設置爲它已有的值,它將不會觸發更改事件,這幾乎總是一件好事。但是,是否有辦法強制更新模型來觸發更改事件,即使它設置爲相同的值?即使不是,我是否可以強制更新模型的屬性以進行註冊?

所以,如果我的模型中我已設置:

defaults:{ 
    attributeToChange: "myValue" 
} 

然後在一個視圖中使用這種模式我稱之爲:

this.model.set('attributeToChange', 'myNewValue', {silent:true}); 

值將改變,但沒有改變事件將被解僱。但是,如果我想在設置屬性值時觸發更改事件,無論設置了什麼內容,該怎麼辦?所以如果我只是做

this.model.set('attributeToChange','myValue'); 

是否有一個參數,我可以添加,將強制這被視爲一個改變?我相信我可以使用

this.model.trigger('change:attributeToChange'); 

但我想知道是否有辦法強制更改事件觸發沒有這個。獎勵問題:如果我將模型的屬性設置爲已有的值,是否會使屬性的先前的值成爲我發起更改之前的值?

this.model.set('attributeToChange','someValue'); 
this.model.set('attributeToChange','anotherValue'); 
this.model.set('attributeToChange','anotherValue'); 
console.log(this.model.previous('attributeToChange')); //someValue or anotherValue? 
+0

好的,讓我試着回答我自己的獎金問題,因爲我意識到在寫出來後很容易進行測試:似乎如果將模型屬性的值設置爲值已經有了,該模型的該屬性_(this.model.previous(...))_的前一個值將註冊爲在設置_new_(但重複)值之前的值。所以上面的例子應該把'anotherValue'寫到控制檯。 – flyingace 2013-04-10 16:28:22

回答

3

不幸的是,這裏沒有任何東西。我想你可以改變set方法的代碼,但它會非常難看。另一種解決方案是在開始或結束時重寫它(這是您可以通過「簡單」更改來覆蓋方法)。

首先,問題是你的屬性還沒有設置(並且都沒有驗證)。
所以,讓我們看看最後。

var set = Backbone.Model.prototype.set; 
Backbone.Model.prototype.set = function() { 
    // do stuff before 
    set.apply(this, arguments); 
    // do stuff after 
    this.trigger('myCustomEvent'); 
    return this; 
}; 

(我不認爲你必須確定你的模型之前做到這一點,但它可能是。)

4

當您設置一個值,在骨幹模型,骨幹會比較新值添加到當前值,並將更改的值添加到數組(請參閱https://github.com/documentcloud/backbone/blob/master/backbone.js#L342)。

然後,如果changes數組包含元素,Backbone將觸發每個更改項目的「更改:{key}」事件,如果silent沒有設置爲true。 (見https://github.com/documentcloud/backbone/blob/master/backbone.js#L357)。最後,它還會觸發全局「更改」事件(同樣,如果silent沒有設置爲true)。

所以,如果你想強制觸發器在未改變的屬性上,你可以手動觸發事件,比如Backbone,或者重寫像@Loamhoof建議的設置方法。

1

我有這個問題時,我設置爲存在模型atrribute另一個對象,具有相同的鍵和值。這是不同的對象,但模型並沒有觸發「變化」事件。 因此,對於這個問題,我已經使用了這樣的解決方案:我在「無聲」模式中將屬性設置爲模型,之後我觸發「更改」 - 特定特定事件的事件。 例如

this.model.set({currentPage: page, 
       currentPanel: panel}, {silent:true}); 
this.model.trigger('change:currentPanel'); 
+0

更改事件偵聽器期望'(model,value,options)'作爲參數。所以觸發器應該是'this.model.trigger('change:currentPanel',this.model,panel,{silent:true});' – 2016-12-12 02:35:20

相關問題