Je voulais juste poster une solution que je l'ai utilisé récemment pour résoudre ce problème. Il utilise des gestionnaires de liaison (valueAppendText et textFromOption) et ajoute une observable à l'observable qui est suivie par le menu déroulant. Cette solution n'est pas complète, mais démontre l'idée de ne pas utiliser l'ajout d'un calcul pour obtenir le texte déroulant. Cette solution utilise également jQuery, qui peut être supprimé, mais puisque j'utilise jQuery dans mes projets (surtout), je l'ai laissé. Le lien jsFiddle ci-dessous montre la fonctionnalité.
Fiddle: http://jsfiddle.net/FjRxn/65/
Balisage:
<select data-bind="options: availableGroups, optionsText: 'Name', optionsValue: 'GroupId', valueAppendText: selectedGroup, optionsCaption: 'Choose...'"></select>
<p>
I am visible
You have chosen <span data-bind="textFromOption: selectedGroup"></span>
<div>
Group Id: <span data-bind="text: selectedGroup"></span>
</div>
</p>
Handlers Reliure:
ko.bindingHandlers.valueAppendText = {
init: function(element, valueAccessor, allBindingsAccessor, context) {
var $element, newValueAccessor, observable, setText;
observable = valueAccessor();
observable.selectedOptionText = ko.observable(null);
newValueAccessor = function() {
return observable;
};
$element = $(element);
setText = function() {
return observable.selectedOptionText($element.find("option:selected").text());
};
setTimeout(setText, 5);
$element.change(function() {
return setText();
});
return ko.bindingHandlers.value.init(element, newValueAccessor, allBindingsAccessor, context);
},
update: function(element, valueAccessor, allBindingsAccessor, context) {
return ko.bindingHandlers.value.update(element, valueAccessor, allBindingsAccessor, context);
}
};
ko.bindingHandlers.textFromOption = {
update: function(element, valueAccessor, allBindingsAccessor, context) {
var newValueAccessor, observable;
observable = valueAccessor();
newValueAccessor = function() {
if (ko.isObservable(observable.selectedOptionText)) {
return observable.selectedOptionText();
}
return observable();
};
return ko.bindingHandlers.text.update(element, newValueAccessor, allBindingsAccessor, context);
}
};
Pourquoi vous n'utilisez juste valeur de texte dropdowns? – DevelopmentIsMyPassion
Je vois maintenant que j'essayais d'avoir knockout construire la liste déroulante avec les valeurs d'option tous définis sur le champ groupid dans le balisage généré, ce qui n'est pas nécessaire. Donc, même si les valeurs ne sont pas définies dans le balisage, lorsque je récupère l'élément sélectionné, je peux obtenir le champ GroupId dans le cadre de l'objet de groupe sélectionné. – voam