我的角度应用程序中有一个控制器需要一些服务器端初始化。我想同步这样做,这意味着应该在启动控制器之前获取数据。我在应用程序配置中使用routeProvider同步加载并将数据注入到许多其他控制器中:
$routeProvider
.when('/Home', {
templateUrl: 'default/home', controller: 'homeController',
resolve: { 'InitPageData': ['initPageService', function (initPageService) { return initPageService.init("home/initpage"); }] }
})
但我有一个控制器没有与之关联的某个路由或templateUrl。它位于许多不同页面和路由使用的共享布局页面中。我试过这个,假设路线下的一切都是' /'将不得不通过,但它没有工作:
.when('/', { // doesn't work
controller: 'appController',
resolve: { 'AppData': ['initPageService', function (initPageService) { return initPageService.init("something/initpage"); }] }
})
我不知道最终会使用此控制器的所有路线,我不想关心它。有没有一种方法可以专门解析数据并注入控制器,无论它在何处被调用?提前谢谢。
答案 0 :(得分:0)
你可以让appController成为你所有其他控制器的父控制器。
类似的东西:
<html ng-controller="appController">
在appController内部,您可以自行执行匿名函数调用,为所有其他控制器执行预加载。
如果要限制某些子控制器行为,请在appController中使用范围变量来规范它们。
这是使用自定义事件告诉应用程序的其他部分&#34; resolve&#34;的经典案例。 JS是异步的 - 你应该注意属性,或者在rootScope上观察事件或使用promises来处理依赖任务。
答案 1 :(得分:0)
如果你想要实现的只是避免反复设置resolve
,你可以写下面的内容。
.config(function($routeProvider) {
function when(path, config){
if (/* you can test path with regex or something */){
config.resolve = { 'AppData': ['initPageService', function (initPageService) { return initPageService.init("something/initpage"); }] };
}
return $routeProvider.when(path, config);
}
when('/Home', {
templateUrl: 'default/home', controller: 'homeController'
})
.when(...)
;
})
我希望它会给你带来一些想法。