0

我有一个这样的模型

function DetailsViewModel() {
    var self = this;
    self.Day = ko.observable();
    self.DateNumber = ko.observable();
    self.Details = ko.observableArray([]);

    self.LoadData = function () {

        var data = { date: '2013-09-18' }
        var url = "php/abc.php"
        var callback = self.Result();

        ajax(url , data , self.Result , type );

        /*
        $.ajax({
            url: "/api/Timesheet/DayDetailResult",
            async: false,
            type: "GET",
            data: ko.toJSON(data),
            dataType: 'JSON',
            success: function (details) {
                self.DateNumber(details.DateNumber);
                self.Day(details.Day);
                self.Details(details.Details);
            }
        });
        */
    };

    self.AddDayDetails = function () {
        window.location.href = '/Home/AddTimeSheetEntry';
    }

    self.Result = function (details) {
        self.DateNumber(details.DateNumber);
        self.Day(details.Day);
        self.Details(details.Details);            
    }

    self.LoadData();
}

这是ajax函数

function ajax(url , data , callback , type ) {

    var type = (type === undefined) ? "GET" : type;
    $.ajax({
        url: url,
        async: false,
        type: type,
        data: ko.toJSON(data),
        dataType: 'JSON',
        success: callback(data)
    });
}   

问题是,当我在 self.LoadData 函数中取消注释 ajax 请求时,一切正常。但我想在整个应用程序中使用全局 ajax 函数。我正在定义 self.Result ,它需要从 ajax 成功中获取数据,并且应该从 ajax 成功中调用。我怎样才能做到这一点。当我运行我的代码时,我得到了这个错误

`details is undefined`

我认为这里应该做一些事情来让它工作,但我不知道怎么做。

ajax(url , data , self.Result , type );

请帮忙。我不是 Javascript 专家。

4

2 回答 2

2

你有两个问题:

  • 您有一个额外的行var callback = self.Result();来执行您的Result函数而没有任何引发异常的参数:details is undefined所以删除这个错误的行。

  • 您的主要问题在于您的success: callback(data)线路,因为这会立即使用提供的值执行您的回调并将其data返回值分配给. successundefined

    您在这里想要的是直接传递您的callback参考:

    $.ajax({
        url: url,
        async: false,
        type: type,
        data: ko.toJSON(data),
        dataType: 'JSON',
        success: callback
    });
    
于 2013-09-19T11:31:41.120 回答
0

简而言之,这是这个问题的正确答案

function DetailsViewModel() {
    var self = this;
    self.Day            =   ko.observable();
    self.DateNumber     =   ko.observable();
    self.Details        =   ko.observableArray([]);
    self.SelectedJob    =   ko.observable();

    self.LoadData = function () {

        var data = { date: '2013-09-18' }
        var url = "php/abc.php"
        var callback = self.Result();

        ajax(url , data , self.Result , type );
    };

    self.Result = function (callbackData) {
        self.DateNumber(callbackData.DateNumber);
        self.Day(callbackData.Day);
        self.Details(callbackData.Details);            
    }

    self.LoadData();
}

正如您在此处看到的,我在自定义 ajax 函数中调用 self.Result。需要在 self.Result 函数中有一个参数,因为这里是 callbackData。

并在自定义函数中简单地将回调成功。

function ajax(url , data , callback , type ) {

    var type = (type === undefined) ? "GET" : type;
    $.ajax({
        url: url,
        async: false,
        type: type,
        data: ko.toJSON(data),
        dataType: 'JSON',
        success: callback
    });
} 

您可以使用任何函数代替 self.Result。看看这个例子

self.getJobs = function () {
    var data = null
    var url = "/api/Timesheet/JobResult"
    var type = 'GET';

    ajax(url, data, self.JobResults, type);
}

self.JobResults = function (jobdata) {
    self.Jobs(jobdata.Details);
}

self.getTasks = function () {
    var data = { JobId: self.SelectedJob() }
    var url = "/api/Timesheet/TaskResult"
    var type = 'GET';

    ajax(url, data, self.TaskResults, type);
}

self.TaskResults = function (taskdata) {
    self.Tasks(taskdata.Details);
} 

请注意,我已经为 getJobs 成功定义了 self.JobResults 并为 getTasks 成功定义了 self.getTasks

于 2013-09-19T12:58:08.473 回答