如何在控制器内手动注入路由解析数据?

Ale*_*Rus 8 javascript angularjs

我有2条路由共享一个控制器,一个需要在视图加载之前解析数据,另一个不需要解析数据.

路由段示例:

...
when('/users', {
    controller: 'UsersCtrl',
    templateUrl: '/partials/users/view.html',
    resolve: {
        resolvedData : ['Accounts', function(Accounts) {
            return Accounts.get();
        }]
    }
}).
when('/users/add', {
    controller: 'UsersCtrl',
    templateUrl: '/partials/users/add.html'
})
...
Run Code Online (Sandbox Code Playgroud)

控制器示例:

app.controller('UsersCtrl', ['$scope', 'Helper', 'resolvedData', 
    function($scope, Helper, resolvedData) {
        // this works for the first route, but fails for the second route with
        // unknown "resolvedDataProvider"
        console.log(resolvedData); 
}]);
Run Code Online (Sandbox Code Playgroud)

有没有办法resolvedData在没有明确使用解析名称作为依赖项的情况下获取控制器?那么可以进行检查吗?

使用$ injector不起作用.我想做类似的事情:

if ($injector.has('resolveData')) { 
     var resolveData = $injector.get('resolveData');
}
Run Code Online (Sandbox Code Playgroud)

但是,即使对于具有resolveDataset('/ users')的路由,这也不起作用:

app.controller('UsersCtrl', ['$scope', 'Helper', '$injector', 
    function($scope, Helper, $injector) {
        // this does not work -> fails with the unknown "resolvedDataProvider" as well
        $injector.get('resolvedData');
}]);
Run Code Online (Sandbox Code Playgroud)

这可以在angularjs中完成吗?或者我应该创建一个新的控制器?

谢谢.

Ale*_*Rus 7

看起来我想出了另一种方法.已解决的数据是其中的一部分$route.所以你可以使用以下方法访问它

app.controller('UsersCtrl', ['$scope', '$route', 'Helper', 
    function($scope, $route, Helper) {

        if ($route.current.locals.resolvedData) {
            var resolvedData = $route.current.locals.resolvedData;
        }
}]);
Run Code Online (Sandbox Code Playgroud)

  • @Fourth - 我不相信添加一个未使用的解决方案返回undefined到路由是一个更好的选择,让我们说我的解决方案更适合我的需求...我做了你的回答,但我不相信你的我的downvote是有道理的. (3认同)
  • 因为我发现这种方法更清洁.我没有添加什么也没做的代码,因为我可以访问我的数据而不必这样做. (2认同)

Fou*_*rth 5

如果其他路由不需要它,只需在该路由上注入undefined:

路由器:

when('/users', {
    controller: 'UsersCtrl',
    templateUrl: '/partials/users/view.html',
    resolve: {
        resolvedData : ['Accounts', function(Accounts) {
            return Accounts.get();
        }]
    }
}).
when('/users/add', {
    controller: 'UsersCtrl',
    templateUrl: '/partials/users/add.html',
    resolve: {
       resolvedData: function() {
          return undefined;
       }
    }
})
Run Code Online (Sandbox Code Playgroud)

控制器:

app.controller('UsersCtrl', ['$scope', 'Helper', 'resolvedData', 
    function($scope, Helper, resolvedData) {
        if(resolvedData){
          //set some scope stuff for it
        } else {
         //do what you do when there is no resolvedData
        }
}]);
Run Code Online (Sandbox Code Playgroud)