Knockout.js中observableArray中对象中计算属性的奇怪行为

Nik*_*sen 3 javascript knockout.js

我有一个奇怪的问题,我有一个对象 - 让我们称之为Person - 它具有可观察的属性FirstName和Lastname,以及一个名为FullName的第三个计算属性.在我的ViewModel中,我有一个可观察的这些Person对象的数组.我还有一个将空Person推送到数组的函数.

这是奇怪的部分.

当我添加一个人,更改FirstName和LastName时,计算的FullName将成为名字和姓氏的串联 - 这是预期的行为.如果我然后添加另一个person对象,更改该对象FirstName或LastName属性然后返回以更改第一个人FirstName,两个Person对象的计算FullName现在是仅最后一个Person的first和lastname属性的串联.

这是代码:

function Person(data)
{
    self = this;
    self.FirstName = ko.observable(data !== undefined ? data.FirstName : "");
    self.LastName = ko.observable(data !== undefined ? data.LastName : "");
    self.FullName = ko.computed(function ()
    {
        return self.FirstName() + " " + self.LastName();
    });
};
function ViewModel() {
    var self = this;
    self.People = ko.observableArray([]);

    self.AddPerson = function()
    {
        self.People.push(new Person());        
    }
}

ko.applyBindings(new ViewModel());
Run Code Online (Sandbox Code Playgroud)

...并且可以使用以下步骤在此Fiddle中重新创建问题:

  1. 按添加
  2. 在两个输入中填写随机文本
  3. 观察按钮下方的连接输入
  4. 再次按添加
  5. 在两个新输入中的任意一个中填写随机文本
  6. 更改其中一个输入的值
  7. 观察到连接的输入现在完全相同.

如何让这个看似简单的场景正常工作?

任何帮助表示赞赏.先感谢您.

PW *_*Kad 5

Self被注册为全局变量,因为它没有包含它.改变自我=这个; to var self = this;

http://jsfiddle.net/AkHhJ/2/

这是在我的手机上很难修复代码,但它的工作原理

var self = this;
Run Code Online (Sandbox Code Playgroud)

如果您没有声明var,则将其视为全局范围的一部分并进行共享.