我有一个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变量。
我做错了什么或错过了什么?
答案 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
});