3

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

奇怪的部分来了。

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

这是代码:

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

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

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

我怎样才能让这个看似简单的场景正常工作?

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

4

1 回答 1

5

由于未将 Self 封闭,因此将其注册为全局变量。改变自我=这个;to var self = this;

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

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

var self = this;

如果你不声明 var 它被认为是全局范围的一部分并且是共享的。

于 2013-09-04T22:49:58.510 回答