2013-03-12 192 views
2

默認骨幹模型我怎樣可以得到下面的代碼基於其他模型值做默認? 這大約是我有什麼聲明相對於其他領域

var Model = Backbone.Model.extend({ 
    defaults:{ 
     name:"", 
     surname:"", 
     fullTextString:"" 
    } 
}); 
model = new Model({name"John", surname:"Doe", fullTextString:"John"+" "+"Doe"}) 

我要的是:

Backbone.Model.extend({ 
    defaults:{ 
     name:"", 
     surname:"", 
     fullTextString:name+" "+surname 
    } 
}); 

回答

1

默認值僅用於當你設置的值,所以你想要什麼是不可能的。

我會使用以下方法來得到你想要的功能:

var Model = Backbone.Model.extend({ 
    defaults: { 
     firstName: "", 
     lastName : "" 
    }, 

    fullName: function() { 
     return this.get("firstName") + " " + this.get("lastName"); 
    }, 

    get: function(attr) { 
     if (typeof this[attr] === "function") { 
      return this[attr](); 
     } 
     return Backbone.Model.prototype.get.call(this, attr); 
    } 
}); 

這樣你就可以初始化你的模型是這樣的:

model = new Model({firstName: "John", lastName: "Doe"}); 

並使用model.get("fullName")獲得命名爲「李四」。

+0

他想要什麼很容易。以我的答案爲例。 – 2013-03-12 12:48:53

+0

@JohnMunsch - 你的答案不符合他要求的,但sQVe的回答顯示了該方案真正要求 – 2013-03-12 12:51:19

+0

@JohnMunsch當然也有不同的解決方案,你的例子並迫使你必須更新兩個地方的名字是正確的壽。我的解決方案不會給你帶來麻煩。 – sQVe 2013-03-12 12:53:20

1

鑑於您希望其中一個屬性是基於傳入值和潛在默認值(例如,如果它們指定了{surname:「Munsch」}但不提供名稱)的計算值,我認爲最簡單的事情就是添加一個初始化程序,如下所示:

var Model = Backbone.Model.extend({ 
    defaults:{ 
     name:"", 
     surname:"" 
    }, 
    initialize: function() { 
     this.set({fullTextString: this.get("name") + " " + this.get("surname")}); 
    } 
}); 

model = new Model({name:"John", surname:"Doe"}); 
model2 = new Model({surname:"Doe"}); 

console.log("model fullTextString: ", model.get("fullTextString")); 
console.log("model2 fullTextString: ", model2.get("fullTextString")); 
+0

如果您想改變她或他的名字,那麼fullTextString也必須在此解決方案中更新。 – sQVe 2013-03-12 12:52:01

+0

@sQVe真的,但在這種情況下可能會或可能不會。我不能說我必須經常重載「get()」:) – 2013-03-12 12:54:42