我正在使用Knockout js,我必须在这里遗漏一些非常概念性的东西。我没有收到错误,因此我很难理解错误的地方。我只想每X秒拉一次数据并用该数据重新填充表格。我正在使用Knockout js进行绑定。此示例代码应足以显示问题:
function AppViewModel() {
var self = this;
self.servers = ko.observableArray([{ Name: 'Loading...', Url: 'Loading...', Environment: 'Loading...', Health: 'Loading...' }]);
self.refreshServers = function () {
$.ajax({
url: '@Url.Action("GetData", "Temp")',
data: { id: 1 },
type: 'POST',
success: function (data) {
self.servers(data);
console.log("finished loading data");
}
});
};
self.refreshServers();
setInterval(self.refreshServers, 15000);
}
ko.applyBindings(fViewModel);
我直接调用函数self.refreshServers来立即填充数据(也许有更好的方法来执行此操作?)然后我将超时设置为连续调用。我从来没有看到第二个ajax请求,也没有第二个日志功能。
答案 0 :(得分:1)
函数以()
结尾,因此在这种情况下,您的函数可能被称为refreshServers()
。另请注意,您将计时器设置为15秒,恕我直言安静。
答案 1 :(得分:1)
setTimeout(self.refreshServers, 15000);
在调用AppViewModel()
时立即运行。
如你所述,它会立即运行,因为它需要function(){}
作为参数才能在所需的15秒后实际执行。
试试这个:
....
setTimeout(function(){
self.refreshServers();
}, 15000);
.....
**
小心这里; setInterval
与setTimeout
不同。
setInterval
将在给定的时间间隔内定期运行一段或一段代码,而setTimeout
只运行一次(或者每次调用AppViewModel()
)。如你所说,你的代码运行一次,但可能在你真正希望它运行之前。
答案 2 :(得分:1)
实际上这里有一些问题。
首先,根据您对问题的描述,听起来您可能需要' setInterval()'而不是' setTimeout()'。区别在于' setInterval()'将基于一定的时间间隔连续执行,而“setTimeout()'只会在经过一段时间后执行一次。
第二个问题是,正如其他人所提到的,第一个问题是第一次调用“self.refreshServers()'确实需要括号才能执行第一个调用,并且内部的引用需要setInterval()'不应该有括号。这是因为在' setInterval()'中,您传递的是对将要执行的函数的引用,而不是执行函数的结果。
减去AJAX,这是一个基于代码的工作示例:
function AppViewModel() {
var self = this;
self.numberOfIntervals = 0;
self.servers = ko.observableArray([{
Name: 'Loading...',
Url: 'Loading...',
Environment: 'Loading...',
Health: 'Loading...'
}]);
self.refreshServers = function () {
// AJAX GOES HERE... THEN UPDATE RESULTS
self.servers.push({
Name: 'New Name...' + self.numberOfIntervals,
Url: 'New Url...' + self.numberOfIntervals,
Environment: 'New Enviornment...' + self.numberOfIntervals,
Health: 'New Health...' + self.numberOfIntervals
});
self.numberOfIntervals++;
};
self.refreshServers();
setInterval(self.refreshServers, 3000);
}
ko.applyBindings(AppViewModel);
这是一个有效的小提琴:http://jsfiddle.net/dunka494/4/
希望它有所帮助!
答案 3 :(得分:0)
感谢@kinakuta和@Marin Smit指出了我无法理解的显而易见的事实。我显然完全读了setInterval和setTimeout之间的区别。
这两个解决方案是添加括号并从setTimeout更改为setInterval