Knockout observable在函数内显示不同的信息

时间:2015-09-16 23:11:16

标签: knockout.js

我有一个jQuery JSON函数,它引入一个JSON文件,使用Knockout映射映射它,然后将它应用于一个可观察的数组:

self.emails = ko.observableArray([]);
$.getJSON("emails.json", function(data) { 
    var emails = ko.mapping.fromJS(data);
    self.emails(emails());
});

我遇到的问题是,如果我在getJSON函数中alert self.emails(),它会显示里面的所有对象,但是如果我alert则是self.emails ()在getJSON函数之外,它是空的。

我对Knockout有些新意,但是根据我的理解,因为我将它们设置为可观察对象,所以它们应该在函数中保持相同的值,因为它们已经应用于{{1变量。

我做错了什么或错过了什么?

1 个答案:

答案 0 :(得分:1)

alert$.getJSON()的回调中工作的原因是因为jQuery函数是异步的,一旦它触发了对服务器的请求,那么就会运行下一行JavaScript并且映射电子邮件的结果不完整,self.emails()为空。

您使用的$.getJSON()语法:

$.getJSON("emails.json", function(data) { 
    var emails = ko.mapping.fromJS(data);
    self.emails(emails());
});

function(data) {$.getJSON()函数的成功回调,因此它将在AJAX请求完成时执行。

使用promise / deferred语法可能更清楚,这样您就可以处理成功(.done()),失败(.fail())和完成(.always())的AJAX请求。

以下是如何使用代码执行此操作的示例:

$.getJSON("emails.json")
    .done(function(data) {
        var emails = ko.mapping.fromJS(data);
        self.emails(emails());
        alert(self.emails());
    })
    .fail(function() {
        // Something bad happened

    })
    .always(function() {
        // No matter success or failure do something here
        // Typically I have used this to stop a busy wait icon or animation
        // so the user knows that the server-side processing is over

    });