I want to combine two return values in my optionsText field, I thought this would be simple, but I am apparently wrong. I'm also using a value for the options field that is outside the normal view model. Here is the original:
<select style="width: 180px" data-bind="visible: false, value: fields.person, options: $root.extra.personList, optionsText: 'FirstName', optionsValue: 'LastName' }, select2: {}">
This works fine, displays the person's FirstName and sets the value as LastName.
This next piece throws an error:
<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: Property 'FirstName' of object # is not a function
I want to combine two return values in my optionsText field, I thought this would be simple, but I am apparently wrong. I'm also using a value for the options field that is outside the normal view model. Here is the original:
<select style="width: 180px" data-bind="visible: false, value: fields.person, options: $root.extra.personList, optionsText: 'FirstName', optionsValue: 'LastName' }, select2: {}">
This works fine, displays the person's FirstName and sets the value as LastName.
This next piece throws an error:
<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: Property 'FirstName' of object # is not a function
Share Improve this question asked Jan 27, 2014 at 18:00 OrganiccatOrganiccat 5,65117 gold badges60 silver badges106 bronze badges 6 | Show 1 more comment2 Answers
Reset to default 20You sure FirstName and LastName are observables? If you're not sure, try this:
optionsText: function(item) { return ko.unwrap(item.FirstName) + '-' + ko.unwrap(item.LastName); }
Or better yet, create a computed in your viewmodel:
self.FullName = function() {
return ko.unwrap(self.FirstName) + '-' + ko.unwrap(self.LastName);
};
And:
optionsText: 'FullName'
how optionsText works is it looks for the property 'FirstName' on the options array that is is bound to. So if your extra person array has a 'FirstName' and a 'LastName' you can extend a computed property to hold full name.
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();
});
}
If they are not observables you don't want to be calling them [ what () does ] it would in that case I would just have a function living on the view model that puts them together which you call from the binding.
FirstName
andLastName
are observables? If you're not sure, try this:ko.unwrap(item.FirstName) + '-' + ko.unwrap(item.LastName)
– sroes Commented Jan 27, 2014 at 18:02ko.computed
. – ach Commented Jan 27, 2014 at 18:26