0

我有这个代码(见下文)。使用 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)");

...
}

在哪里

serviceClient.getTasks = function (param) {
        console.log("Get Model from Service");
        return $.ajax({
            type: "GET",
            url: serviceRoot + "GetAllTasks",
            beforeSend: serviceFramework.setModuleHeaders,
            data: "projectid=" + param,
            cache: false
        });
    };

为什么 INNER 结果和 OUTER 结果不同?

4

2 回答 2

0

您的主要问题是您的 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");
});

不好:http: //jsfiddle.net/bqsjm/

一种解决方案:http: //jsfiddle.net/bqsjm/1/

您要么需要优雅地传递 ajax 返回的 promise 对象,要么.done在设置后执行的函数内添加函数调用self.Tasks

说到这一点,self.Tasks当您编写以下代码时,您将成为 DOM 的孤儿:

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"

希望有帮助。

于 2013-09-05T09:05:39.190 回答
0

你在你的 ajax 中尝试过成功事件吗?您可以在此事件处理程序中进行所有数组映射

于 2013-09-05T07:43:54.573 回答