函数未在Javascript控制台中定义

时间:2014-10-30 21:11:05

标签: javascript jquery ajax knockout.js

我不知道为什么控制台中的功能显示未定义。我试图使它正确,我似乎无法得到它。它工作正常,直到我尝试使用setInterval函数。此外,构建一直说我错过了一个分号,但我只是没有看到它。

$(document).ready(function () {

    var machineDataViewModel = {
        machineDataItems: ko.observableArray([]),

        loadMachineDataItems: function DataLoad() {

            machineDataViewModel.machineDataItems.length = 0;

            $.getJSON("http://localhost/JsonRestful/Service1.svc/GetMachineData", function (data) {


                $.each(data.GetMachineDataResult, function (index, item) {
                    machineDataViewModel.machineDataItems.push(new machineDataModel(item));

                });
            });
        }
    };

    ko.applyBindings(machineDataViewModel);

    machineDataViewModel.loadMachineDataItems();
    setInterval(DataLoad, 9000);
});

function machineDataModel(item) {
    this.mach_no = ko.observable(item.mach_no),
    this.VAR1 = ko.observable(item.VAR1),
    this.VAR2 = ko.observable(item.VAR2),
    this.VAR3 = ko.observable(item.VAR3),
    this.VAR4 = ko.observable(item.VAR4)
};

1 个答案:

答案 0 :(得分:3)

您无法按照自己的方式定义DataLoad()功能,并希望它可以在setInterval()中使用。它根本不起作用。符号DataLoad仅在该函数的范围内可用。相反,您可以将其称为:

setInterval(machineDataViewModel.loadMachineDataItems, 9000);

这是一个简单的演示,显示您不能像对待您的函数那样命名并期望在该范围之外使用该名称:http://jsfiddle.net/jfriend00/6t0pp60s/(查看调试控制台以查看错误)。


仅供参考,如果你需要你的函数具有正确的值this(我认为你实际上并不这样做),那么你会这样称呼它(在结尾处用一个分号)每一行):

setInterval(machineDataViewModel.loadMachineDataItems.bind(machineDataViewModel), 9000);

对于分号问题,jsHint指向this.VAR4分配行。我建议将machineDataModel()改为此(在jsHint中为您提供干净的健康状况):

function machineDataModel(item) {
    this.mach_no = ko.observable(item.mach_no);
    this.VAR1 = ko.observable(item.VAR1);
    this.VAR2 = ko.observable(item.VAR2);
    this.VAR3 = ko.observable(item.VAR3);
    this.VAR4 = ko.observable(item.VAR4);
}