3

私はリモートサーバにデータを問い合わせる前に最初の2つのフィルタに影響する2つのフィルタを持っています。ドロップダウンとプロンプトを選択 - 短く空を選択

私には選択肢があり、そのオプションは$scope.locationCodesです。この選択は別のドロップダウン(顧客)に依存します。顧客が選択されると、私はIDを持っていて、それを最初の関数で返された約束に渡します。

問題1:私は本当にすぐに(コードドロップダウンで)場所コードを選択するように行けば

できるだけ早く私は、顧客を選択すると、オプションは空白になります。ぼかしてからもう一度選択しようとすると、少し時間がかかることを示すオプションが表示されます。入力された配列のこの遅延を処理する最善の方法は何ですか?

コード:

HTML:

<select data-ng-options="locationCode in locationCodes"></select> 

JS:

$scope.getShipAbbleLocations = function (terminalId) { 
     var customerId = $scope.customer.id; 
     return Service.getShipAbbleLocations(customerId, terminalId).then(function (data) { 
     getLocationCodes(data); 
     _.defer(function() { 
      $scope.$apply(); 
     }) 
     }); 

    }; 



function getLocationCodes(data) { 
      for (var i = 0; i < data.locationCodes.length; i++) { 
      $scope.locationCodes.push(["(" + data.locationCodes[i].shipThruLocationCode + ")", data.locationCodes[i].shipThruLocationId]); 
      } 
      $scope.$apply(); 
     } 

問題2:

キッカーは、顧客が選択されるまで、コードのドロップダウンを無効にする必要があるということです。私はコントローラのタイムアウトに依存していたので、アレイをポピュレートするための時間を許す「イネーブル」の遅延を設定することでディスエーブルを処理しています。これはうまくいきますが、顧客を変更すると問題が表示され、最初の無効化のケースについて心配する必要はありません。

この遅延/非同期性を処理するためのタイムアウト(これはうまくいけば、angularjs /約束のよりよい理解を示す)より良い方法があるのだろうかと思います。

+0

'ng-disabled ="!locationCodes ||!locationCodes.length "'をselectに追加するだけです。 –

+0

初期ディスエーブル状態を気にせずに顧客を変更する必要はありません。元のシナリオはまだ – devdropper87

+0

と表示されるので、顧客が変更された場合にのみ無効にする必要がありますか? –

答えて

1

最も良い方法は、LOADERを表示し、AJAX呼び出しが完了するまでUIを無効にすることです。

非同期のajax呼び出しのためにローダーを実装する方が常に良い方法です。

インターセプタにローダコードを実装することができます。そのため、リクエストごとにローダが表示され、すべてのAJAXコールに対してインターセプタ内に実装する必要はありません。