AngularJS - Is there a way to inject data into a controller without using routes?

北慕城南 提交于 2019-12-23 03:11:40

问题


I have a controller in my angular application that requires some server-side initialization. I would like to do it synchronously, meaning that the data should be fetched before the controller is initiated. I synchronously load and inject data into many other controllers using the routeProvider in application configuration:

$routeProvider
        .when('/Home', {
            templateUrl: 'default/home', controller: 'homeController',
            resolve: { 'InitPageData': ['initPageService', function (initPageService) { return initPageService.init("home/initpage"); }] }
        })

but I have this one controller that doesn't have a certain route or templateUrl that it's associated with. It's in a shared layout page used by many different pages and routes. I tried this, assuming that everything under the route '/' will have to pass through that, but it didn't work:

.when('/', {    // doesn't work
            controller: 'appController',
            resolve: { 'AppData': ['initPageService', function (initPageService) { return initPageService.init("something/initpage"); }] }
        })

I don't know all the routes that will end up using this controller and I don't want to care about it. Is there a way that I could specifically resolve data and inject into a controller regardless of where it's invoked? Thanks in advance.


回答1:


You could have appController be parent controller for all your other controllers.

Something similar to this:

<html ng-controller="appController">

Inside appController you could have a self executing anonymous function call which does the pre-load stuff for all your other controllers.

If you want to restrict certain child controller behavior then use a scope variable in appController to regulate them.

This is classic case of using custom events to tell other parts of application of "resolve". JS is asynchronous - you should either watch for properties, or watch of events on rootScope or use promises to handle dependent tasks.




回答2:


If what you want to achieve is only avoiding to set resolve repeatedly, you could write something like below.

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

I hope it would bring some idea to you.



来源:https://stackoverflow.com/questions/29889040/angularjs-is-there-a-way-to-inject-data-into-a-controller-without-using-routes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!