Javascript 在knockoutjs上下文中使用ajax转移结果
我有这个代码(见下文)。通过Firebug进行调试和观看,我可以在“.done”-函数中获得所需的数据。我的self.Task完全符合我的要求。然而,有些事情正在发生Javascript 在knockoutjs上下文中使用ajax转移结果,javascript,jquery,ajax,knockout.js,Javascript,Jquery,Ajax,Knockout.js,我有这个代码(见下文)。通过Firebug进行调试和观看,我可以在“.done”-函数中获得所需的数据。我的self.Task完全符合我的要求。然而,有些事情正在发生 ViewModel = function(serviceClient) { ... serviceClient.getTasks(projectId) .done(function (data) { self.Tasks = ko.observableArray(
ViewModel = function(serviceClient) {
...
serviceClient.getTasks(projectId)
.done(function (data) {
self.Tasks = ko.observableArray(
ko.utils.arrayMap(data, function (item) {
return new TaskViewModel(item);
}));
alert("Inner result: " + self.Tasks().length + " task(s)");
})
alert("Outer result " + self.Tasks().length + " task(s)");
...
}
在哪里
为什么内部结果和外部结果不同?您是否在ajax中尝试了成功事件?您可以在这个eventhandler中完成所有的数组映射。您的主要问题是,您的ajax调用没有在执行“外部”警报之前完成。考虑做一些类似的事情:
var request = serviceClient.getTasks(projectID).done(function(data) {
alert("Inner: " + data.length);
});
// ... more code ...
request.done(function(data) {
alert("Outer: " + data.length);
});
当然,我觉得这有点傻。感觉第二个警报应该在第一个.done
处理程序中。这相当于:
serviceClient.getTasks(...).done(function(data) {
alert("Inner");
alert("Outer");
});
不好:
一个解决方案:
您需要优雅地传递ajax返回的promise对象,或者在设置self.Tasks
后执行的.done
函数中添加函数调用
说到这里,当您编写以下代码时,您正在从DOM中孤立self.Tasks
:
self.Tasks = ko.observableArray(...arrayMap...);
我想你是想写:
self.Tasks(...arrayMap...);
考虑:
// DOM
<span data-bind="text: $root.foo"></span>
// Javascript land
var vm = { foo: ko.observable("foo") };
ko.applyBindings(vm);
// <span> tag will read "foo"
vm.foo = ko.observable("bar");// orphaned
// <span> tag still reads "foo"
//DOM
//Javascript土地
var vm={foo:ko.observable(“foo”)};
ko.应用绑定(vm);
//标签将显示“foo”
vm.foo=ko.可观察(“条”);//孤儿
//标签上仍然写着“foo”
希望有帮助。因为
ajax
中的a
表示异步。那么我如何“等待”self.Tasks“出现”?我需要来自.done“-function之外的ajax调用(serviceClient.getTask)的“数据”在我的viewmodel中,以下工作非常完美:viewmodel=function(model,serviceClient){var self=this;self.Projects=ko.observearray(ko.utils.arrayMap(model,function(item){返回新的ProjectViewModel(item)这就是viewmodel的调用方式:var client=new ServiceClient();client.getModel().done(function(model){var viewmodel=new viewmodel(model,client);ko.applyBindings(viewmodel,document.getElementById(“”);})调用“ServiceClient.getTasks”返回“data”。我能够捕获“.done”函数内部的数据,但不知何故,它在外部是未定义的。
// DOM
<span data-bind="text: $root.foo"></span>
// Javascript land
var vm = { foo: ko.observable("foo") };
ko.applyBindings(vm);
// <span> tag will read "foo"
vm.foo = ko.observable("bar");// orphaned
// <span> tag still reads "foo"