从Computed Property访问Knockout Observable属性会产生TypeError

时间:2015-02-02 12:14:35

标签: javascript knockout.js

我确定这可能是一个基本问题,但我有以下ViewModel:

var viewModel = new EditorViewModel();
viewModel.addData(model);
ko.applyBindings(viewModel);

var EditorViewModel = function () {

    var self = this;
    self.addData = function (data) { .
        ko.mapping.fromJS(data, {}, self);
    };
    self.isUpdate = ko.computed(function () { return self.id() !== "0"; }, self);

};

ViewModel通过addData方法接收数据。然后,此方法使用Knockout Mapping Plugin映射接收的数据。有关信息,此数据是通过外部JQuery AJAX调用提供的。

问题是我在Mozilla中遇到以下错误:

TypeError: self.Id is not a function

我不确定为什么计算属性会导致此错误?

1 个答案:

答案 0 :(得分:1)

默认情况下,当您创建ko.computed时,会立即对其进行评估。

因此,在您调用function () { return self.id() !== "0"; }方法之前,addData会运行,因此您的ID属性将会丢失并且您将获得异常。

要解决此问题,您需要告诉KO使用deferEvaluation option推迟评估:

 self.isUpdate = ko.computed(
     function () { return self.id() !== "0"; }, 
     self, { deferEvaluation: true });