2013-02-18 31 views
2

某人可以在Backbone中向我解釋範圍嗎?在下面的例子中,使用get方法檢索默認變量的值是最好的方法嗎?Backbone Scope訪問變量的最佳做法

如果我不使用get方法,我的數組就會以undefined的形式出現。

App.Models.Site = Backbone.Model.extend({ 
    defaults: { 
     testArray: [1, 2, 3] 
    }, 

    initialize: function(){ 
     console.log('initialize', this.testArray); // logs undefined 
     console.log('initialize', this.get('testArray')); // logs [1, 2, 3] 

     this.test(); 
    }, 

    test: function(){ 
     console.log('initialize', this.testArray); // logs undefined 
     console.log('test', this.get('testArray')); // logs [1, 2, 3] 
    } 
}); 
+0

您是否希望爲模型實例獲取'testArray'的默認值或'testArray'的實際值?我的文章是否回答你的問題?儘管我最初誤解了你正在尋找的東西並編輯了我的答案,但現在我認爲它可能是正確的。 – 2013-02-18 12:02:24

回答

1

您可以App.Models.Site.prototype.defaults訪問defaults值。

如果您使用get(見下文),您將檢索您的模型實例的當前testArray值。這在實例中並不總是相同的。


模型屬性存儲在模型的.attributes屬性中,而不是模型本身。檢索模型屬性值的唯一方法是使用get(propertyName)

,它的完成這樣的原因是因爲set不只是改變對象的價值,但也觸發事件來更新與新價值等UI如果你能做到的,而不是this.testArraythis.get('testArray')將是合理的您也可以將值分配給this.testArray - 但這會破壞事情。

因此,您也不應該使用.attributes來分配值 - 不會觸發事件處理程序。

1

幾件事。

首先,在defaults中,您正在定義模型字段,而不是模型實例的(對象)字段。模型字段是序列化到數據存儲的內容。您的對象字段只是您的對象的一部分,可以滿足您所需的任何目的。

其次,我認爲你的違約可能使用一種方法來構造默認值更好的寫法:使每一個模型的[1, 2, 3],而不是每個模型共享至一個參考的副本開始

.... 
defaults: function(){ 
     return { 
     testArray: [1, 2, 3] 
     }; 
     }, 
... 

只有數組是[1, 2, 3](如果您的任何模型更改了該數組,則說明如果您執行this.get('testArray')[0]=4,突然默認值將看起來非常不同)。如果你只有set這個字段到一個新的數組值,這當然不會發生。

相關問題