【问题标题】:knockoutjs - computed observables inside observable arrayknockoutjs - 在 observable 数组中计算 observables
【发布时间】:2014-01-21 22:52:42
【问题描述】:

我有一个 ViewModel,它是一个可观察的对象数组,其中包含我将使用 foreach 输出的联系人信息。我需要有一个依赖于每个联系人的firstNamelastName 的计算观察值:

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

但我收到此错误Uncaught TypeError: Object #<HTMLDocument> has no method 'firstName'。有人可以解释为什么我对 this.firstName() 的引用失败了吗?谢谢。

【问题讨论】:

  • 在 obs 数组中使用计算函数的任何原因?
  • 我正在构建一个可以编辑名字和姓氏的应用程序,因此他们必须更新 UI 以反映更改
  • 我也不是淘汰赛专家。但是你能在你的 obs 数组中删除计算函数并拥有单独的计算函数吗?我创建了小提琴,但不知何故出错。如果你能修复那么应该为你工作jsfiddle.net/kD83g/12
  • 我可以要求downvoter在否决问题时添加评论。

标签: javascript knockout.js


【解决方案1】:

问题是您的联系人定义中的this 并没有指代联系人本身;它指的是全局对象。使用函数(“经典”构造函数或简单地创建对象字面量并返回它的函数)来创建联系人,以便它可以正确设置其上下文。

【讨论】:

  • 我不明白为什么this 没有指向当前对象?有没有我可以阅读的文档?
  • reference 说:“当函数作为对象的方法被调用时,它的 this 被设置为调用该方法的对象。”。这是否意味着如果我调用 ko.computed 而没有像 fullName: ko.computed(function () { return this.firstName() + " " + this.lastName(); }), 这样的第二个参数,那么 this 将引用我的联系人对象?
猜你喜欢
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 2014-04-17
  • 2014-02-27
  • 2018-06-06
  • 2012-05-05
  • 2014-07-03
  • 2016-11-03
相关资源
最近更新 更多