私の AngularJS アプリでは、コントローラーといくつかのディレクティブを初期化する前に、サーバーからのメタデータが必要です。データを返すサービスがありますが、コントローラとディレクティブがデータを待つことができませんでした。
myapp.factory("db",["$http",function($http)
{
var db = {};
db.metadata = function(callback)
{
$http.jsonp("/db/?f=metadata&callback=JSON_CALLBACK").success(function(data)
{
callback(data);
}).error(function(error)
{
console.log(error);
});
}
...
return db;
}]);
var myctrl = myapp.controller("MyCtrl",["$scope","$location","db",function($scope,$location,db)
{
db.metadata(function(data)
{
$scope.metadata = data;
// initialize $scope members with $scope.metadata for directives
...
});
}]);
db.metadata() への呼び出しが戻る前に、ディレクティブが未定義の $scope メンバーを使用して初期化を試みるため、これは明らかに機能しません。$routeProvider 解決プロパティを使用してみました:
myapp.config(["$routeProvider",function($routeProvider)
{
$routeProvider.when("/",{
templateUrl: "./myview.html",
controller: "MyCtrl",
resolve: {
metadata: ["db","$q",function(db,$q)
{
var deferred = $q.defer();
db.metadata(function(data)
{
deferred.resolve(data);
});
return deferred.promise;
}]
}
});
}]);
var myctrl = myapp.controller("MyCtrl",["$scope","$location","db","metadata",function($scope,$location,db,metadata)
{
$scope.metadata = metadata;
// initialize $scope members with $scope.metadata for directives
...
}
インジェクション配列の「メタデータ」のミニフィケーションに適した宣言により、Angularが吐き出すため、これは実行されません。宣言を削除すると、挿入されたメタデータが未定義になります。私は何を間違っていますか?