从 Computed 属性 访问 Knockout Observable 属性 给出 TypeError
Accessing Knockout Observable Property from Computed Property Gives TypeError
我确定这可能是一个基本问题,但我有以下 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 映射插件映射接收到的数据。有关信息,此数据是通过外部 JQuery AJAX 调用提供的。
问题是我在 Mozilla 中遇到以下错误:
TypeError: self.Id is not a function
我不确定为什么计算 属性 会导致此错误?
默认情况下,当您创建 ko.computed
时,它会立即被计算。
所以在你的情况下,function () { return self.id() !== "0"; }
在你调用你的 addData
方法之前运行,所以你的 id 属性 将会丢失,你会得到异常。
要解决此问题,您需要告诉 KO 使用 deferEvaluation
option:
推迟评估
self.isUpdate = ko.computed(
function () { return self.id() !== "0"; },
self, { deferEvaluation: true });
我确定这可能是一个基本问题,但我有以下 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 映射插件映射接收到的数据。有关信息,此数据是通过外部 JQuery AJAX 调用提供的。
问题是我在 Mozilla 中遇到以下错误:
TypeError: self.Id is not a function
我不确定为什么计算 属性 会导致此错误?
默认情况下,当您创建 ko.computed
时,它会立即被计算。
所以在你的情况下,function () { return self.id() !== "0"; }
在你调用你的 addData
方法之前运行,所以你的 id 属性 将会丢失,你会得到异常。
要解决此问题,您需要告诉 KO 使用 deferEvaluation
option:
self.isUpdate = ko.computed(
function () { return self.id() !== "0"; },
self, { deferEvaluation: true });