Javascript 角度JS延迟控制器和指令初始化,直到数据从服务器返回
我的AngularJS应用程序需要服务器提供一些元数据,然后才能初始化控制器和一些指令。我有一个返回数据的服务,但无法让控制器和指令等待数据Javascript 角度JS延迟控制器和指令初始化,直到数据从服务器返回,javascript,angularjs,angularjs-directive,angularjs-service,angularjs-controller,Javascript,Angularjs,Angularjs Directive,Angularjs Service,Angularjs Controller,我的AngularJS应用程序需要服务器提供一些元数据,然后才能初始化控制器和一些指令。我有一个返回数据的服务,但无法让控制器和指令等待数据 myapp.factory("db",["$http",function($http) { var db = {}; db.metadata = function(callback) { $http.jsonp("/db/?f=metadata&callback=JSON_CALLBACK").success(function
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 resolve属性:
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呕吐。删除声明会导致注入的元数据未定义。我做错了什么?问题是html仍然存在
<div ng-controller="MyCtrl">
因为“MyCtrl”是通过$routeProvider配置为myview.html分配控制器的,所以不需要它。当角度“呕吐”时,您到底会遇到什么错误,为什么要将控制器分配给全局变量(
MyCtrl
)当您可以在routeProvider?Studie中将控制器引用为控制器:“MyCtrl”
时,错误是:错误:未知提供程序:元数据提供程序如何缩小代码?您能否检查您的解析对象在缩小的文件中是否损坏。您可以尝试在解析对象中使用字符串化键,看看这是否有帮助(resolve:{'metadata':…}
)。我正在将r.js与uglify2 Optimizer一起使用,它不会损坏我的routes模块,但您的Optimizer可能不是这样。尚未尝试缩小,仍在开发中,因此这不是缩小问题。