0

私が使用する ajax 呼び出しのみを含む別の typescript ファイルがあります。

ノックアウト可観測配列をロードするために使用している2番目のtypescriptファイルがあります

最後に、ノックアウト オブジェクトを呼び出して、データをドロップダウンにバインドしようとするビューがあります。

これは私のajaxデータ呼び出しです

export class ILRDataService {
    public dataServiceOptions: DataServiceOptions;
    public getPeriodsForCandidate() {
        var urlToUse = this.dataServiceOptions.baseUrl + 'ilrdata/' +
            this.dataServiceOptions.periodIdentifier +
            '/AcademicPeriods/' + this.dataServiceOptions.candidateIdentifier;
        return $.ajax({
            url: urlToUse
        });
    }
}

これは私のクラスから呼び出されます。これは getPeriodsForCandidate メソッドを呼び出すメソッドです

export class AcademicPeriod {
    private dataServiceOptions: DataServiceOptions;
    public LoadPeriodsForCandidate() {
        var self = this;
        var dataService = new Ilr.ILRDataService(self.dataServiceOptions);
        return dataService.getPeriodsForCandidate()
            .done(function (academicPeriods) {
                $.each(academicPeriods, function (index, element) {
                    self.Items.push(element);
                    console.log(element);
                });
            });
    }
}

そして最後に、私の見解では、次のコードがあります

var academicPeriodsViewModel = new Ilr.AcademicPeriod(dataServiceOptions);
$.when(academicPeriodsViewModel.LoadPeriodsForCandidate())
    .then(function() {
        ko.applyBindings(academicPeriodsViewModel, document.getElementById("AcademicPeriods"));
});

私の問題は、AcademicPeriod 期間の LoadPeriodsForCandidate メソッドにあります。関数は、$.each の処理後ではなく、すぐに戻り、Internet Explorer でバインディングが失敗する原因となっています。

バインディングは毎回失敗するわけではありません。F12 開発者ツールを開いた場合、バインドは機能します。ただし、F12 開発ツール ウィンドウが閉じていると、バインディングが頻繁に失敗します。コンソールを表示するには F12 ウィンドウを開く必要があるため、失敗メッセージが表示されません。その瞬間、すべてが機能します。

Chrome または Firefox で上記のコードを使用しても問題ありません。

テストしましたが、新しいコールバック関数を作成してコードを次のように変更した場合:

public LoadPeriodsForCandidate(callbackFunction) {
    var self = this;
    var dataService = new Ilr.ILRDataService(self.dataServiceOptions);
    dataService.getPeriodsForCandidate()
        .done(function (academicPeriods) {
            $.each(academicPeriods, function (index, element) {
                self.Items.push(element);
            });
            callbackFunction();
        });
    }

ビューのコードを次のように変更します。

academicPeriodsViewModel.LoadPeriodsForCandidate(bindAcademicPeriods);
function bindAcademicPeriods() {
    ko.applyBindings(academicPeriodsViewModel, document.getElementById("AcademicPeriods"));
}

その後、すべてがIEで動作します

しかし、私はこれはもっと面倒だと思っており、メソッド LoadPeriodsForCandidate を変更して $.when().then() を正しく使用できるようにするためにどのように/何をする必要があるかを知りたいと思っています

4

1 に答える 1

0

.then()関数内の代わりに呼び出す必要があり.done()ます。

呼び出し.then()は、コールバック (およびそれが返すすべての promise) が終了するのを待機する新しい promise を返します。

を呼び出す必要がないことに注意してください$.when()

于 2013-09-30T16:11:28.743 に答える