2

コントローラーに次の機能があります。

$scope.model.listApplicantStatuses = function(){
    var statusChoices = jobsService.getApplicantStatuses();

    if(statusChoices !== null)
            return statusChoices;

    //if($scope.model.listApplicantStatuses.inProgress)
    //  return;
    //$scope.model.listApplicantStatuses.inProgress = true;
    jobsService.fetchApplicantStatuses().then(function(data){
        jobsService.setApplicantStatuses(data.data);
        return data.data;
    },
    function(data){
        $scope.layout.showNotification('error', 10 * 1000, 'we are is experiencing technical difficulties <a href="mailto:support@" class="btn btn-danger">Contact Support</a>');
    });
}

対応するサービス コード:

jobsServ.fetchApplicantStatuses = function(){
    return $http.get(utils.getBaseUrl() + '/applications/status_choices', utils.getConfig());
}
jobsServ.getApplicantStatuses = function(){
    return that.applicantStatusChoices;
},
jobsServ.setApplicantStatuses = function(choices){
    that.applicantStatusChoices = choices;
},

DOM の使用例:

<select class="statusSelect" data-ng-model="model.editedApplicant[applicant.id].status" data-ng-show="layout.statusVisible(applicant.id) && !layout.statusLoader[applicant.id]" data-ng-options="key as val for (key, val) in model.listApplicantStatuses()" data-ng-change="model.updateStatus(applicant.id)"></select>

今、私が抱えている問題は、クロムが最初の関数呼び出しが完了するまで待機し、AJAX 呼び出しから取得したデータを提供し、その間に undefined を返し、Firefox が関数を何度も呼び出すことです。不要な XHR リクエストを大量に作成します。

私は、inProgress $scope 変数を設定していたコードをコメントアウトしました。これは、私には jQurish ソリューションのように思えます。また、多くの場所でコードを変更し、このような別のブール値フラグを作成する必要があるためです。サーバーへのすべてのリクエスト。

4

2 に答える 2

1

xhr を送信する関数に _root という名前のローカル変数を割り当て、リクエストが送信されたら _root.ingProgress を true に設定し、応答が受信されたら false に切り替えることで、これを解決しました。

魅力のように機能します。

コード:

$scope.model.listApplicantStatuses = function(){
    var statusChoices = jobsService.getApplicantStatuses();

    if(statusChoices !== null)
            return statusChoices;
    var _root = this;
    if(_root.inProgress)
        return;

    _root.inProgress = true;
    jobsService.fetchApplicantStatuses().then(function(data){
        jobsService.setApplicantStatuses(data.data);
        _root.inProgress = false;
        return data.data;
    },
    function(data){
        _root.inProgress = false;
        $scope.layout.showNotification('error', 10 * 1000, 'We are currently experiencing technical difficulties <a href="mailto:support@" class="btn btn-danger">Contact Support</a>');
    });
}
于 2013-10-03T12:42:28.537 に答える