【问题标题】:Strange behavior of computed property in objects in observableArray in Knockout.jsKnockout.js 中 observableArray 对象中计算属性的奇怪行为
【发布时间】:2013-09-08 14:41:56
【问题描述】:

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

奇怪的部分来了。

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

代码如下:

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. 观察连接的输入现在完全相同。

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

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

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

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

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

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

    var self = this;
    

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

    【讨论】:

    • 非常感谢!不敢相信我错过了。我刚刚检查了我的一些较旧的项目,发现我记得那些'var'。我什至记得在与遇到这种情况的视图相同的视图上使用的其他对象中的“var”。现在已经使用 Knockout 6 个月了,我只是不明白为什么我以前没有遇到过这个问题。 :D
    猜你喜欢
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2012-11-01
    相关资源
    最近更新 更多