私の問題は、ページの読み込み時に、 $routeChangeSuccess イベントが発生したときに AJAX から受信したデータの準備ができていない可能性があることです。つまり、イベント ハンドラーと AJAX の間に競合状態があります。
ページの読み込み時にイベントが発生したときに、このデータが確実に存在するようにするにはどうすればよいですか。
ここに問題を示すフィドルがあります: http://jsfiddle.net/ajrt4/3/
私のシナリオ: $http
AJAX 呼び出しによって受信されたデータが取り込まれる選択ボックスがあります。この選択ボックスは、ナビゲーションに使用され、ユーザーが選択して移動できる一連のルートを表します。選択ボックスでは、選択されたオプションが常に現在のルートを反映している必要があるため$routeChangeSuccess
、ユーザーがブラウザーの [戻る] ボタンと [進む] ボタンを使用したときに、イベントのイベント ハンドラーを使用して、選択されたドロップダウンを変更します。
コントローラーにあるものの例を次に示します。
$http.get('getData').success(function(data) {
// Sets the dropdown menu data
$scope.data = data;
});
$scope.$on("$routeChangeSuccess", function(event, currentRoute){
// Set the selected option here based off the route
if (typeof $scope.selected == 'undefined') {
for (var i = 0; i < $scope.data.length; i++) {
if ($scope.data[i].name == $routeParams.name) {
$scope.selected = $scope.data[i]; // sets the current selection based off the route parameter
return;
}
}
}
});
意見:
<select ng-model="selected" ng-options="option as option.name for option in data"></select>
受信したデータは一度だけロードする必要があるため、これは別のコントローラーとビューで使用されるため、resolve
使用する必要はありません。$routeProvider
これは、イベント ハンドラーで AJAX 呼び出しをネストせず、重複してデータを取得しないことも意味します。これを解決できると思うのは、Angular の$q
promise API を使用することですが、その方法はわかりません。