2012-05-10 4 views
19

ähnliche Frage: Select element's initial valueKnockoutJS Wählen Sie Optionen und ausgewählter Wert

Ich habe ein Problem, den Anfangswert des Auswahlelementes einstellen. Ich habe grundsätzlich eine Liste von Seed-Daten, die vom Server kommen, um die Dropdown-Liste aufzufüllen, und ich möchte, dass der ausgewählte Wert darstellt, was aus der Entität ausgewählt werden soll.

Da der ausgewählte Wert des Datenmodells nicht mit dem Objektverweis in den Seed-Daten übereinstimmt, wird nichts ausgewählt.

Momentan durchlaufe ich jede Entity, finde den korrekten ausgewählten Wert, setze das gleich dem Äquivalent der Seed-Daten, dann weiß Knockout wie man es verbindet.

Gibt es eine elegantere Lösung, die das? Ich fiedelte ein vereinfachtes Beispiel mit mehr Details ... http://jsfiddle.net/hbrYM/14/

Antwort

34

Wie Sie richtig erraten haben, stimmt die selectedValue-Referenz nicht überein, also wählt KO dieses Element nicht aus. Um dies zu erreichen, speichern Sie das komplexe Objekt nicht im ausgewählten Wert und wählen stattdessen die ID aus, da die Gleichheit eines primitiven Typs erfolgreich sein kann und der richtige Wert ausgewählt ist.

http://jsfiddle.net/VLTFB/3/

Sie werden die optionsValue Option auf den Optionen verwenden müssen, um die Bindung (wenn der Sinn :)

<select data-bind="options: seedData, 
        optionsText: 'firstName', 
        optionsValue: 'ID', 
        value: data.selectedValue"> 

EDIT Sie die richtigen erneut auswählen können

Wie diskutiert macht Artikel mit einem berechneten (ungetesteten).

vm.currentlySelected = ko.computed(function() { 
    for (var i = 0; i < this.seedData().length; i += 1) { 
     var data = this.seedData()[i]; 
     if (data.ID === this.selectedValue()) { 
      return data; 
     } 
    } 
    return null; 
}, vm); 

Ich hoffe, dies hilft.

+0

Danke für die Antwort, es macht Sinn. Ich sende derzeit das Objekt zurück (nicht nur die ID), das dann deserialisiert und persistiert wird. Ich hatte wirklich gehofft, es gibt eine Möglichkeit, KO zu "instruieren", wie ich dies verdrahte, weil ich so viele verschiedene Auswahlen in dieser bestimmten UI habe ... – aswallows

+1

Sie können das Objekt immer noch recht einfach zurücksenden, wenn Sie die Daten vom Server auswählen kommt herein, sende einfach die ID. Wenn Sie eine neue ausgewählte zurück senden müssen, schreiben Sie einfach eine berechnete, die das aktuell ausgewählte Objekt retourniert (siehe Bearbeiten). Es ist tatsächlich schlanker, es auf diese Weise zu tun, Sie haben bereits die Seed-Daten, also warum sollten Sie diese zusätzlichen Informationen noch einmal senden? – madcapnmckay

+0

Danke für die Rückmeldung! Ich werde einen Blick darauf werfen, diesen Ansatz zu verwenden. – aswallows