Is there a way to keep the value
binding to the object, but have the optionsValue
be a property on the object. As of now if I specify both, the optionsValue
property that is selected will populate the value
binding. Id like to keep the object intact in the observable, but specify what value to be set in the select list value. This way a form submit will send the optionsValue
I chose.
@Html.DropDownListFor(q => q.DivisionId, new SelectList(Enumerable.Empty<string>()), new { data_bind="options: divisions, optionsText: 'Name', optionsValue: 'Id', value: division, optionsCaption: ' - '" })
function AddCrossPoolGameDialog() {
var self = this;
self.divisions = ko.observableArray([]);
self.division = ko.observable();
self.awayDivisionTeams = ko.computed(function () {
var division = ko.utils.arrayFirst(self.divisions(), function(item) {
return self.division.Name() == item.Name;
});
if (division) {
return division.DivisionTeamPools;
}
return [];
});
}
To create an observable, assign the ko. observable function to the variable. A default value can be specified in the constructor of the call. Knockout then converts your variable into a function and tracks when the value changes, in order to notify the UI elements associated with the variable.
Binding syntaxThe binding name should generally match a registered binding (either built-in or custom) or be a parameter for another binding. If the name matches neither of those, Knockout will ignore it (without any error or warning). So if a binding doesn't appear to work, first check that the name is correct.
KO is able to create a two-way binding if you use value to link a form element to an Observable property, so that the changes between them are exchanged among them. If you refer a simple property on ViewModel, KO will set the form element's initial state to property value.
The $data variable is a built-in variable used to refer to the current object being bound. In the example this is the one of the elements in the viewModel.
You can't get both the optionsValue
and value
bindings to point to different objects, but you can create a simple workaround.
In order to get your form to submit a simple value, use optionsValue
to point to your bound item's property that you want posted with the form. Then assign the value
binding to an observable. Last, create a computed
to automatically find and return the correct object when the selected value changes.
Example bindings:
<select data-bind="options: options,
optionsText: 'name',
optionsValue: 'id',
value: selectedOptionId"></select>
<br/>
<br/>
Selection Option Object : <span data-bind="text: selectedOption"></span><br/>
Selection Option name : <span data-bind="text: selectedOption().name"></span><br/>
Selection Option id : <span data-bind="text: selectedOption().id"></span><br/>
and view model :
var optionModel = function(id,name){
var self = this;
self.id = id;
self.name = name;
}
var viewModel = function(){
var self = this;
self.options = [
new optionModel(1,"First"),
new optionModel(2,"Second")
];
self.selectedOptionId = ko.observable(self.options[0].id);
self.selectedOption = ko.computed(function(){
return ko.utils.arrayFirst(self.options, function(item){
return item.id === self.selectedOptionId();
});
});
}
ko.applyBindings(new viewModel());
I've posted this to a jsFiddle here.
Hope this helps!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With