Javascript knockoutjs-可观测数组中的计算可观测值

Javascript knockoutjs-可观测数组中的计算可观测值,javascript,knockout.js,Javascript,Knockout.js,我有一个ViewModel,它是一个可观察的对象数组,保存联系人的信息,我将使用foreach输出这些信息。我需要根据每个联系人的firstName和lastName计算观察值: var contacts = ko.observableArray([ { firstName: ko.observable("Jim"), lastName: ko.observable("Carrey"), fullName: ko.computed(fu

我有一个ViewModel,它是一个可观察的对象数组,保存联系人的信息,我将使用
foreach
输出这些信息。我需要根据每个联系人的
firstName
lastName
计算观察值:

var contacts = ko.observableArray([
    {
        firstName: ko.observable("Jim"),
        lastName:  ko.observable("Carrey"),
        fullName:  ko.computed(function(){
            return this.firstName() + " " + this.lastName();
        }, this),
        image:     ko.observable("images/jim.jpg"),
        phones:    ko.observableArray([
            {type: ko.observable("Mobile"), number: ko.observable("(555) 121-2121")},
            {type: ko.observable("Home"), number: ko.observable("(555) 123-4567")}
        ])
    },
    ...//other objects of the same structure
]);
ko.applyBindings(contacts);

但是我得到了这个错误
未捕获的TypeError:Object没有方法“firstName”
。有人能解释为什么我对这个.firstName()的引用失败了吗?谢谢。

问题在于,您的联系人定义中的
并不是指联系人本身;它指的是全局对象。使用一个函数(要么是“经典”构造函数,要么只是一个创建对象文本并返回它的函数)来创建联系人,以便它可以正确设置其上下文。

有没有理由在obs数组中使用计算函数?我正在构建一个名和姓氏可编辑的应用程序,因此,他们必须更新用户界面以反映变化。我也不是淘汰赛专家。但是您可以删除obs数组中的计算函数,并使用单独的计算函数吗。我创造了小提琴,但不知何故却出错了。如果您可以修复,那么应该对您有用。我可以请求downvoter在downvoting问题时添加注释吗。我不明白的是,为什么
未指向当前对象?有没有我可以阅读的文档?你可以尝试这样说:“当一个函数作为一个对象的方法被调用时,它的this被设置为该方法被调用的对象。”。这是否意味着如果我调用ko.computed时没有第二个参数,比如
fullName:ko.computed(函数(){return this.firstName()+“”+this.lastName();}),
那么
这个
将引用我的联系人对象?