2014-01-27 41 views
9

我想在我的optionsText字段中結合兩個返回值,我認爲這很簡單,但我顯然是錯誤的。我也使用正常視圖模型之外的選項字段的值。這是原始的:在knockout.js中設置組合optionsText

<select style="width: 180px" data-bind="visible: false, value: fields.person, options: $root.extra.personList, optionsText: 'FirstName', optionsValue: 'LastName' }, select2: {}"> 

這工作正常,顯示人的名字和設置值爲姓氏。

這下一塊拋出一個錯誤:

<select style="width: 180px" data-bind="visible: false, value: fields.person, options: $root.extra.personList, optionsText: function (item) { return item.FirstName() + '-' + item.LastName() }, optionsValue: 'LastName', select2: {}"> 

遺漏的類型錯誤:對象#的特性「姓」是不是一個函數

+3

你確定'FirstName'和'LastName'是可觀察的?如果你不確定,試試這個:'ko.unwrap(item.FirstName)+' - '+ ko.unwrap(item.LastName)' – sroes

+0

我不確定,我會試試看。 – Organiccat

+2

在開始將其添加到視圖中之前,請考慮將該函數移動到視圖模型中並調用它。這將導致_much_更乾淨的代碼。 –

回答

10

你確定名字和姓氏的觀測?如果你不知道,試試這個:

optionsText: function(item) { return ko.unwrap(item.FirstName) + '-' + ko.unwrap(item.LastName); } 

或者更好的是,在創建視圖模型的計算一個:

self.FullName = function() { 
    return ko.unwrap(self.FirstName) + '-' + ko.unwrap(self.LastName); 
}; 

和:

optionsText: 'FullName' 
+0

我似乎無法得到這個工作:http://jsfiddle.net/a1mjnczL/1/ –

+1

@ChrisNevill我知道你的評論是4個月大,但作爲一個別人的說明,FullName必須是選項,而不是視圖模型。 http://jsfiddle.net/a1mjnczL/3/ – Silvermind

+0

謝謝Silvermind。我想我一定會想出一個解決方案,但忘了回來了。 –

0

如何optionsText的工作原理是,它看起來對於綁定的選項數組上的屬性'FirstName'。因此,如果您的額外人員數組有「FirstName」和「LastName」,則可以擴展計算屬性以保存全名。

function ViewModel(){ 
    var self = this; 
    self.peopleList = ko.observableArray(); 
} 
function Person(f, l){ 
    var self = this; 
    self.FirstName = ko.obserable(f); 
    self.LastName = ko.obserable(l); 
    self.FullName = ko.computed(function(){ 
     return self.FirstName() + ' ' + self.LastName(); 
    }); 
} 

如果他們不可觀測量你不想被美其名曰[什麼()做],將在這種情況下,我只想對視圖模型的函數生活是把它們放在一起,你打電話從綁定。