Javascript 在knockout.js中设置组合选项Text

Javascript 在knockout.js中设置组合选项Text,javascript,knockout.js,Javascript,Knockout.js,我想在optionsText字段中组合两个返回值,我认为这很简单,但我显然错了。我还在“选项”字段中使用一个值,该值不在“正常视图”模型中。这是原件: <select style="width: 180px" data-bind="visible: false, value: fields.person, options: $root.extra.personList, optionsText: 'FirstName', optionsValue: 'LastName' }, select

我想在optionsText字段中组合两个返回值,我认为这很简单,但我显然错了。我还在“选项”字段中使用一个值,该值不在“正常视图”模型中。这是原件:

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

这可以正常工作,显示此人的名字,并将值设置为LastName

下一部分抛出一个错误:

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


未捕获的TypeError:对象的属性“FirstName”不是函数

您确定FirstName和LastName是可观察的吗?如果您不确定,请尝试以下方法:

optionsText: function(item) { return ko.unwrap(item.FirstName) + '-' + ko.unwrap(item.LastName); }
或者更好的方法是,在viewmodel中创建一个计算模型:

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


optionsText的工作原理是在绑定到的选项数组上查找属性“FirstName”。因此,如果额外的person数组具有“FirstName”和“LastName”,则可以扩展计算属性以保存全名

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

如果它们是不可观察的,您就不想调用它们[what(),does],在这种情况下,我只需要在视图模型上有一个函数,它将它们放在一起,您可以从绑定中调用它们

您确定
FirstName
LastName
是可观察的吗?如果你不确定,试试这个:<代码> KOK。打开(item .FrestNeNT)+'++'Ko.un包装(item .LaSTNEX)< /Cord> >我不确定,我会尝试一下。在你开始把它添加到你的视图之前,考虑把那个函数移到你的视图模型中并调用它。这将导致代码更加清晰。@Jeffmerca这样做,并使其成为
ko.computed
。谢谢sroes,我没有管理以前的模型,所以我不知道它们不可见。你能回答这个问题吗?我会记下来的。@ChrisNevill我知道你的评论已经发表了4个月了,但请注意,全名必须是选项的成员,而不是viewmodel。谢谢你。我想我最终一定想出了一个解决办法,但忘了回到这里。
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();
    });
}