コントローラーが必要とするデータ (およびコントローラーが提供するディレクティブ) を実行する前に利用できるように、いくつかの ajax 呼び出しを解決しようとしています。実行の順序は機能していますが、作成したオブジェクトを返す代わりに、コントローラーに注入された結果は $http の応答オブジェクトです。
{
config: { … },
data: { … },
headers: { … },
status: 200
}
私のコードは基本的に次のようになります。
app.config([
'$routeProvider', function($routeProvider)
{
$routeProvider
.when('/path', {
…,
"resolve": {
"data": [
'$http',
function($http)
{
return $http
.get('/api/data')
.success(function(data,status) { return data.rows[0]; })
.error(function(data,status) { return false; });
}
]
}
});
}
]);
私はばかですか?$http の成功からの戻り値は、実際に $http によって返されるものであるべきではありませんか?
私も試しました
…
"resolve": {
"data": [
'$http',
function($http)
{
var response;
$http
.get('/api/data')
.success(function(data,status) { response = data.rows[0]; })
.error(function(data,status) { response = false; });
return response;
}
]
}
しかしdata
、コントローラーに注入されたオブジェクトは未定義でした ($http は非同期でありresolve
、$http によってブロックされなかったので、$http の準備が整う前に返されたのではないかと推測しています)。
PS $http の同期性は、オプション オブジェクトで定義できる必要があります。
解決
app.config([
'$routeProvider', function($routeProvider)
{
$routeProvider
.when('/path', {
…,
"resolve": {
"data": [
'$http',
function($http)
{
return $http
.get('/api/data')
.then(
function success(response) { return response.data.rows[0]; },
function error(reason) { return false; }
);
}
]
}
});
}
]);
Ajay beniwal のポインターとMark Rajcok のポインターに感謝します。
PSthen()
は$qのページに記載されています。