2013-08-18 27 views
1

在Backbone中,當我將Model的屬性設置爲與之前相同的值時,「更改」事件不會觸發。Backbone.js:始終檢測模型何時設置屬性,而不是/只是/更改

筆者認爲:

initialize: function() { 
    this.$lastRollResult = this.$el.find('#lastRollResult'); 
    this.listenTo(this.model, 'change:lastRoll', this.render); 
}, 

render: function() { 
    this.$lastRollResult 
    .html(this.model.get('lastRoll')) 
    .addClass('shaking'); 

    var self = this; 
    setTimeout(function() { 
    self.$lastRollResult.removeClass('shaking'); 
    }, 1000); 
}, 

events: { 
    'click #button': function() { 
    this.model.set('lastRoll', getRandomInteger(1, 6)); 
    } 
} 

有時候,當我打電話getRandomInteger(),INT引腳將是相同的前一個,導致我的.SET( 'lastRoll',int)以未註冊爲「改變「事件。但這意味着我的「搖動」課不會被應用,那很糟糕。

即使我設置的值是相同的,我怎樣才能使骨幹始終識別何時設置了屬性?是否有某種「設置」事件? (沒看到一個在文檔。)

編輯:我知道,有可能是一個{無聲:真正}/.trigger()黑客做到這一點,但沒有任何「乾淨」或「語義」的方式來始終識別.set()調用?

+0

可能的重複[我可以強制更新模型的屬性註冊爲更改,即使它不是?](http://stackoverflow.com/questions/15931233/can-i-force-an-更新到模型的屬性註冊爲一改變,即使它) – Jackson

+0

找到我的答案在一個重複的主題: http://stackoverflow.com/questions/15931233/can-i-force-an-update-to-a-models-attribute-to-register-as-a-change-even-if-it – Jackson

回答

3

我認爲你的設計是錯誤的。該觀點不應該挑選一個隨機數字,並告訴模型這是它的新價值,該觀點應該告訴模型彙總一個新數字。那麼你可以在你的模型中有這個:

roll: function() { 
    this.set('lastRoll', getRandomInteger(1, 6), { silent: true }); 
    this.trigger('change:lastRoll', this, this.get('lastRoll')); 
} 

和你的看法只是this.model.roll()。是的,你仍然在做{silent:true}trigger黑客,但至少它會在正確的地方。

當然,這可能有奇怪的副作用,所以你可以去模特的背部和悄然取消設置背後的價值設定一個新前:

roll: function() { 
    // I suppose you could quietly unset here if you feel bad 
    // about fiddling with `attributes`. 
    this.attributes.lastRoll = null; 
    this.set('lastRoll', getRandomInteger(1, 6)); 
} 

同樣,有模型上的獨立roll方法一個方便的方式來隱藏來自外部世界的所有這些詭計。

+0

謝謝你的建議;我將確保榮譽MV *。另外感謝關於trigger()的多個參數的提示,我不知道它花了超過1個。我喜歡attributes.attribute = null建議,它似乎最快,我需要嘗試一下(似乎有點粗略,但它可能工作...)。 – Jackson

+0

如果搞亂'屬性'會讓你感到緊張,你總是默默地解除它。 –

相關問題