Javascript 在knockoutjs上下文中使用ajax转移结果

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(

我有这个代码(见下文)。通过Firebug进行调试和观看,我可以在“.done”-函数中获得所需的数据。我的self.Task完全符合我的要求。然而,有些事情正在发生

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"