Knockout:异步调用在ko.applyBindings()之前未完成.这是最好也是最简单的做法
Knockout : Async call not finished before ko.applyBindings(). Best, and easiest practice ?
我知道这个问题可能以前在这里被问过,但我似乎无法获得任何"最佳实践"。。作为一个新手,我可以用一种容易理解的方式。。。
淘汰码
$(document).ready(function() {
function viewModel() {
var self = this;
self.contacts = ko.observableArray();
$.ajax({
type: "POST",
url: "ClubWebServices.asmx/GetContacts",
data: "{'abc':'" + 123 + "'}", // if ur method take parameters
contentType: "application/json; charset=utf-8",
success: function (data) {
var contactData = data.d;
console.log("Nr 1: " + contactData);
self.contacts(contactData);
console.table(self.contacts());
},
dataType: "json",
failure: function(error) {
console.log(error);
}
});
console.table("Nr 2: " + self.contacts());
ko.applyBindings(new viewModel());
}
结果是在console.log Nr 1.之前调用了console.log Nr 2
所以。。如何在不创建层次结构的情况下解决这个问题?在层次结构中,我必须实现使用OnSuccess和onFailure事件的DataService层?
以下是一些想法。
- 您正试图从函数的声明中创建viewModel的实例,这可能会导致ko绑定出现问题
- 另一个注意事项是,在成功回调中对
self
的引用可能不是你想象的那样。使用调试器可以让你清楚地了解这一点
我会尝试重新安排一些类似的东西:
$(document).ready(function() {
var viewModel = function (contactData) {
var self = this;
self.contacts = ko.observableArray(contactData);
}
$.ajax({
type: "POST",
url: "ClubWebServices.asmx/GetContacts",
data: "{'abc':'" + 123 + "'}", // if ur method take parameters
contentType: "application/json; charset=utf-8",
success: function (data) {
var contactData = data.d;
console.log("Nr 1: " + contactData);
ko.applyBindings(new viewModel(contactData));
},
dataType: "json",
failure: function(error) {
console.log(error);
}
});
}
更改:我在ajax请求之前关闭您的viewModel
声明,并将contactData
传递给新的viewModel
构造函数。
此外,创建一个jsfiddle将极大地帮助查找错误的原因。
我认为您的代码没有任何问题。
-
在ViewModel构造函数中,您可以将模型绑定到DOM
-
在服务回调之后,将数据添加到observableArray,然后ko将更新绑定DOM。
如果您希望在self.contacts
填充后调用您的"Nr 2"表,请订阅:
var initialized = self.contacts.subscribe(function (newValue) {
console.table("Nr 2: " + self.contacts()); // could use newValue instead
initialized.dispose();
});
dispose
调用防止在将来的更新中再次发生这种情况。或者你想让它,我不知道。
哦,正如JulianSolo所指出的,不要在视图模型创建函数中调用applyBindings。
相关文章:
- JQuery:向多个匹配结果添加换行符的最简单方法
- 访问对象的最简单方法'的单独财产
- 在Scroll上更新CSS代码:简化它就不会了'不要使用JQuery和最简单的Javascript
- 什么'这是使用jQuery将一些文本锚定到外部链接的最简单方法
- 什么是处理JavaScript的最简单的网络抓取工具
- 实施会员系统的最简单方法是什么
- 我需要最快、最简单的方法来在 Javascript 中绘制数据
- 出错时更改文本字段边框的最简单方法
- JavaScript:获取第一个月前 6 个月的日期的最简单方法
- 在CreateJS中加载视频的最简单方法
- 对于 MEAN 堆栈 docker 容器来说,在 OS X 和 DigitalOcean 上具有相同配置的最简单设置是什
- 使用JavaScript过滤从网页复制的文本的最简单方法
- 创建在Javascript和PHP之间使用的唯一代码的最简单方法
- 使用JS找出字符串中字符重复的最简单方法是什么
- 在jQuery就绪函数上未完成Primefaces布局组件
- 为具有未定义值的嵌套对象设置默认值的最简单方法
- 在 Javascript 中等待一些异步任务完成的最简单方法
- 为什么这个带有最简单的构造函数的 javascript 对象未定义
- Knockout:异步调用在ko.applyBindings()之前未完成.这是最好也是最简单的做法
- 最简单的javascript函数未启动