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

标签 javascript knockout.js

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

奇怪的部分来了。

当我添加一个人时,更改 FirstName 和 LastName,计算出的 FullName 变成名字和姓氏的串联 - 这是预期的行为。如果我然后添加另一个人对象,更改该对象的 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());

...问题可以在 this Fiddle 中重现使用以下步骤:

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

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

感谢任何帮助。先感谢您。

最佳答案

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

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

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

var self = this;

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

关于javascript - Knockout.js 中 observableArray 对象中计算属性的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18624884/

相关文章:

javascript - 我应该为 ReactJs 中的烛台图使用哪个图表模块/库?

javascript - 查找与 DOM 窗口关联的选项卡

javascript - 通过单击另一个类启用/禁用特定类

data-binding - 从子元素访问 knockout 绑定(bind)

knockout.js - 如何使用 ko.mapping 只观察一个键

javascript - 使用对象继承时 Knockout 映射的问题

javascript - 按金额滚动事件?

javascript - ReactJS 使用 useState 双重渲染 bool 状态

Jquery 颜色选择器绑定(bind)处理程序创建多个 div

javascript - jquery 数据表的自定义 ko 绑定(bind)