【发布时间】:2016-11-15 06:31:54
【问题描述】:
我是 Knockout.js 的新手,我正在使用它来绑定来自 WebAPI 调用的数据。 我有一个令人沮丧的场景,getData() 方法在无限循环中被调用。调试后发现注释掉console.log(self.activityLogs())就消失了。当我将它留在 getData 方法中时,它不会导致循环问题。
谁能解释这里发生了什么以及为什么会发生这种无限循环?
$(function () {
var ActivityLogViewModel = function () {
self = this;
self.activityLogs = ko.observableArray([]); //data
getData();
console.log(self.activityLogs()); // when this is here, it goes into infinite loop
function getData() {
$.ajax({
type: "GET",
url: "/api/EnvironmentsApi/activityLogs",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
console.log(data);
self.activityLogs(data);
console.log(self.activityLogs());
},
error: function (error) {
alert(error.status + "<--and--> " + error.statusText);
}
});
}
return {
self: self
}
};
ko.applyBindings(ActivityLogViewModel);
});
不确定这是否相关,但这是我在 HTML 表中绑定它的方式。
<tbody data-bind="foreach: activityLogs">
<tr>
<td>b...</td>
</tr>
</tbody>
【问题讨论】:
-
ko.applyBindings(new ActivityLogViewModel); -
使用
self.activityLogs.peek()读取数据。否则,您将创建一个依赖项,并且 Knockout 将重新评估整个ActivityLogViewModel函数,从而导致无限循环。
标签: knockout.js