2014-01-27 9 views
9

Ich möchte zwei Rückgabewerte in meinem OptionenText-Feld kombinieren, ich dachte, das wäre einfach, aber ich bin anscheinend falsch. Ich verwende auch einen Wert für das Optionsfeld außerhalb des normalen Ansichtsmodells. Hier ist das Original:Einen kombinierten optionsText in knockout.js setzen

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

Dies funktioniert gut, die First Person zeigt und setzt den Wert als Name.

Das nächste Stück wirft einen Fehler:

<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: {}"> 

Uncaught Typeerror: Anwesen ‚Vorname‘ von Objekt # ist nicht eine Funktion

+3

Sind Sie sicher, 'FirstName' und' LastName' sind Observables? Wenn Sie nicht sicher sind, versuchen Sie dies: 'ko.unwrap (item.FirstName) + '-' + ko.unwrap (item.LastName)' – sroes

+0

Ich bin mir nicht sicher, ich werde das ausprobieren. – Organiccat

+2

Bevor Sie damit beginnen, das in Ihre Ansicht einzufügen, ziehen Sie in Betracht, diese Funktion in Ihr Ansichtsmodell zu verschieben und aufzurufen. Es wird zu _much_ cleaner code führen. –

Antwort

10

Bist du sicher, Vorname und Nachname sind Observablen? Wenn Sie nicht sicher sind, versuchen Sie dies:

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

Oder noch besser, ein in Ihrem Ansichtsmodell berechnet erstellen:

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

Und:

optionsText: 'FullName' 
+0

Ich kann nicht scheinen, dass dies funktioniert: http://jsfiddle.net/a1mjnczL/1/ –

+1

@ChrisNevill Ich weiß, dass Ihr Kommentar 4 Monate alt ist, aber als eine Notiz für andere, FullName muss ein Mitglied der sein Option, nicht das Viewmodel. http://jsfiddle.net/a1mjnczL/3/ – Silvermind

+0

Danke Silvermind. Ich denke, dass ich irgendwann eine Lösung gefunden habe, aber vergessen habe, hierher zurückzukommen. –

0

wie optionsText funktioniert, ist es aussieht für die Eigenschaft 'Vorname' im Optionsfeld, an das gebunden ist. Wenn also Ihr Extra-Person-Array einen 'FirstName' und einen 'LastName' hat, können Sie eine berechnete Eigenschaft auf den vollen Namen erweitern.

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(); 
    }); 
} 

Wenn sie nicht Observablen Sie nicht wollen, zu rufen sie [was() tut], es wäre in diesem Fall hätte ich nur eine Funktion Leben auf dem View-Modell, das sie zusammen bringt, die Sie anrufen von der Bindung.