AngularJS - 有没有办法在不使用路由的情况下将数据注入控制器?

时间:2015-04-27 06:52:34

标签: javascript angularjs dependency-injection angularjs-controller

我的角度应用程序中有一个控制器需要一些服务器端初始化。我想同步这样做,这意味着应该在启动控制器之前获取数据。我在应用程序配置中使用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"); }] }
        })

我不知道最终会使用此控制器的所有路线,我不想关心它。有没有一种方法可以专门解析数据并注入控制器,无论它在何处被调用?提前谢谢。

2 个答案:

答案 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(...)
    ;
})

我希望它会给你带来一些想法。