0

私はこのコードを持っています(以下を参照)。Firebug でデバッグして監視すると、「.done」関数内で必要なデータを取得できることがわかります。しかし、何かが起こっている

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で成功イベントを試しましたか? このイベントハンドラ内ですべての配列マッピングを行うことができます

于 2013-09-05T07:43:54.573 に答える
0

主な問題は、「外部」アラートが実行される前に ajax 呼び出しが終了しないことです。次のようなことを検討してください。

var request = serviceClient.getTasks(projectID).done(function(data) {
  alert("Inner: " + data.length);
});
// ... more code ...
request.done(function(data) {
  alert("Outer: " + data.length);
});

もちろん、それは私にはばかげているように思えます。.done2 番目のアラートは最初のハンドラーにある必要があるように感じます。これは次と同等です。

serviceClient.getTasks(...).done(function(data) {
  alert("Inner");
  alert("Outer");
});

ダメ: http://jsfiddle.net/bqsjm/

1 つの解決策: 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 に答える