0

他のデータに基づいてAJAX呼び出しを行う計算されたオブザーバブルがあります(計算されたオブザーバブル内)。結果のデータは、UIの一部にデータを入力するために使用されます。UIのその部分が非表示になっていることがあり、非表示のときにAJAX呼び出しを避けたいと思います。現在、次のものがありますが、次のようにisVisibleなるたびに更新されtrueます。

this.loadData = ko.computed(function() {
    if (this.isVisible()) {
        this.isProcessing(true);
        var self = this;
        $.when.apply($, ko.utils.arrayMap(this.parent.data.filteredSelectedDatasetLinks(), function(datasetLink) {
            return $.ajax({
                url: datasetLink.getDownloadUrl('.json'),
                success: function(data) {
                    //... do stuff with the data
                }
            });
        }))
        .done(function() {
            self.isProcessing(false);
        });
    }
}, this);

だから明らかに私はこれをどうにかして分割する必要がありますが、私はそれを行う方法を理解していません。繰り返しになりisVisibleますが、がfalseの場合、更新は発生しません。trueの場合、変更がisVisible行われるたびに更新が行われfilteredSelectedDatasetLinksます。trueになると、falseのときに変更されたisVisible場合に更新が行わfilteredSelectedDatasetLinksれます。

4

2 に答える 2

0

おそらく、が変更されたときにajaxを呼び出したいと思うでしょうfilteredSelectedDatasetLinks(そして表示されている場合のみ?)。これを行うための最良の方法は、subscribe関数を使用してその依存関係を明示的にすることだと思います...(私は少し単純化し、最後の「this」の問題を修正しました)

this.filteredSelectedDatasetLinks.subscribe(function() {
    if (this.isVisible()) {
        this.isProcessing(true);
        var self = this;
        $.when.apply($, ko.utils.arrayMap(this.filteredSelectedDatasetLinks(), function(datasetLink) {
            return $.ajax({
                url: datasetLink.getDownloadUrl('.json'),
                success: function(data) {
                    //... do stuff with the data
                }
            });
        }))
        .done(function() {
            self.isProcessing(false);
        });
    }
}, this);

最初の試みの問題は、ko.computedが関数を一度実行し、サブスクライブする必要のあるオブザーバブルを自動的に計算することです。あなたの場合、これにはisVisibleオブザーバブルが含まれていました(これはあなたが望んでいたものではありません)。ただし、サブスクライブ呼び出しで直接明示的にすると、コールバックの起動について心配する必要がなくなりisVisibleます。

于 2013-02-15T23:48:56.797 に答える
0

これが、RPNiemeyerのコメントに基づいて私が使用することになったものです。

this.trackData = ko.computed(function() {
    this.parent.data.filteredSelectedDatasetLinks();    // for notification
    this.isDataDirty(true);
}, this);

this.loadData = ko.computed(function() {
    if (this.isVisible() && this.isDataDirty()) {
        this.isDataDirty(false);
        this.isProcessing(true);
        var self = this;
        $.when.apply($, ko.utils.arrayMap(this.parent.data.filteredSelectedDatasetLinks.peek(), function(datasetLink) {
            return $.ajax({
                url: datasetLink.getDownloadUrl('.json'),
                success: function(data) {
                    //... do stuff with the data
                }
            });
        }))
        .done(function() {
            self.isProcessing(false);
        });
    }
}, this);
于 2013-02-16T00:03:29.303 に答える