如何进行初始JavaScript Ajax初始化?
我正在用ajax获取信息。我希望我的document.ready函数(ajax)首先启动,因为敲除文件首先启动,我的“var initialData”值变为null。我的Ajax是如何开始的 我的剧本:如何进行初始JavaScript Ajax初始化?,javascript,jquery,ajax,knockout.js,Javascript,Jquery,Ajax,Knockout.js,我正在用ajax获取信息。我希望我的document.ready函数(ajax)首先启动,因为敲除文件首先启动,我的“var initialData”值变为null。我的Ajax是如何开始的 我的剧本: <script type="text/javascript"> var initialData; function functionViewModel() { $(document).ready(function ()
<script type="text/javascript">
var initialData;
function functionViewModel() {
$(document).ready(function () {
$.ajax({
type: "POST",
url: "KnockoutGrid2.aspx/GonderUrunler",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
console.log(msg.d);
initialData = msg.d;
}
});
});
var fn = {
friends: ko.observableArray(initialData)
};
fn.removeUser = function (item) {
fn.friends.remove(item);
};
return fn;
};
ko.applyBindings(functionViewModel());
</script>
var初始数据;
函数functionViewModel(){
$(文档).ready(函数(){
$.ajax({
类型:“POST”,
url:“KnockoutGrid2.aspx/GonderUrunler”,
数据:“{}”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
成功:功能(msg){
控制台日志(msg.d);
initialData=msg.d;
}
});
});
变量fn={
朋友:ko.observearray(initialData)
};
fn.removeUser=功能(项目){
fn.好友。删除(项目);
};
返回fn;
};
applyBindings(functionViewModel());
在代码中使用async:false
$.ajax({
type: "POST",
url: "KnockoutGrid2.aspx/GonderUrunler",
data: "{}",
async : false,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
console.log(msg.d);
initialData = msg.d;
}
});
更新2
@user3297291的答案比我的好,因为它是处理表单所有状态的Knockout。请不要在回答ajax请求时执行applybindings
用户需要知道数据尚未加载,这可以通过knockout处理
原始答案
如果将敲除的初始化移动到success
函数中:
<script type="text/javascript">
$(document).ready(function () {
$.ajax({
type: "POST",
url: "KnockoutGrid2.aspx/GonderUrunler",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
console.log(msg.d);
initialData = msg.d;
// All initialization inside the 'success' function
function functionViewModel(initialData) {
var fn = {
friends: ko.observableArray(initialData)
};
fn.removeUser = function (item) {
fn.friends.remove(item);
};
return fn;
};
ko.applyBindings(functionViewModel(initialData));
}
});
});
</script>
在这里,我使用的是
self
(请参阅),并且不返回fn
,因为敲除处理其状态。您不想等待applyBindings
,直到您的ajax响应得到处理。。。如果您在应用绑定时让淘汰等待,那么您的文档将看起来很难看,而您的用户将看不到任何东西
你应该做什么:
- 只要
触发,就立即应用绑定$(document.ready
- 确保您的viewmodels使用
属性,这些属性允许您稍后轻松地插入数据可观察的
- 确保定义某种加载状态,以向用户显示正在下载的数据
函数functionViewModel(){
var friends=ko.observearray([]);
var负载=可观察的ko(真实);
var removeUser=函数(用户){
删除(用户);
}
//获取数据并在完成后将其写入可观察属性
$.ajax({
类型:“POST”,
url:“KnockoutGrid2.aspx/GonderUrunler”,
数据:“{}”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
成功:功能(msg){
friends(JSON.parse(msg.d));
加载(假);
}
});
返回{
朋友:朋友,,
加载:加载,
removeUser:removeUser
};
};
$(文档).ready(函数(){
applyBindings(functionViewModel());
});代码>仍然相同…但给出以下警告:“主线程上的jquery-3.1.1.js:9425[Deprection]Synchronous XMLHttpRequest已被弃用,因为它会对最终用户的体验造成有害影响。有关更多帮助,请选中“so initialdata仍然为空?Yep仍然为空”。你可以在这里看到:为什么不把你的(var-fn=)部分放在success函数中呢?这次(var-fn)没有出现。我认为击倒是在做些什么,但我不知道答案。。。var Fn将变为空白。ı有2个错误。上图:所有数据均为真,但这次给出了此错误。您可以在这里看到:并且认为您忘记了console.log()下的write var initialData。但是现在需要将数组转换为initialData,因为msg.d即将出现字符串,并且需要将其转换为:)更新:我找到了我的答案,并编写了代码“var initialData=JSON.parse(msg.d);”现在一切都好了,再次使用thx:))哦,有一件事,functionViewModel()
可以移到$(文档)之外。ready()
函数。即使这是可行的,也不是应该怎么做。只有在加载完所有数据后才应用绑定会破坏可观察/数据绑定属性的主要用途之一。@user3297291谢谢,你说得对,Knockout可以处理所有状态,包括等待Ajax请求显示数据。
<script type="text/javascript">
// Updating 'functionViewModel()' to add 'self'.
// Move functionViewModel()' outside ajax response
function functionViewModel(initialData) {
var self = this;
self.friends = ko.observableArray(initialData);
self.removeUser = function (item) {
self.friends.remove(item);
};
};
$(document).ready(function () {
$.ajax({
type: "POST",
url: "KnockoutGrid2.aspx/GonderUrunler",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
console.log(msg.d);
initialData = msg.d;
// All initialization inside the 'success' function
ko.applyBindings(functionViewModel(initialData));
}
});
});
</script>