Контроллер угловой JS-задержки и директива инициализации до тех пор, пока данные не будут возвращены с сервера
Моему приложению 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
...
});
}]);
Это, очевидно, не сработает, поскольку директивы будут пытаться инициализировать, используя неопределенные члены $scope, до того, как вызов db.metadata() вернется. Я попытался с помощью свойства $routeProvider resol:
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. Удаление объявления приводит к тому, что введенные метаданные будут неопределенными. Что я делаю неправильно?
1 ответ
Проблема оказалась в том, что HTML все еще имел
<div ng-controller="MyCtrl">
Это не нужно, так как MyCtrl был назначен контроллер для myview.html через конфигурацию $routeProvider.