如何在Angular UI Router中访问$ urlRouterProvider的'otherwise'属性

时间:2015-11-18 09:46:28

标签: angularjs angular-ui-router

在某些情况下,我想导航到默认或“其他”状态。所以我需要从控制器获取路由对象中配置的其他状态。

当我尝试在我的指令的控制器中注入$urlRouterProvider时,我收到错误:

  

错误:[$ injector:unpr]未知提供者:$ stateProviderProvider< -   $ stateProvider< - bbvNavDirective

我做错了什么?

示例代码:

.config([ '$stateProvider', '$urlRouterProvider', '$locationProvider', ( $stateProvider, $urlRouterProvider, $locationProvider ) => {

    $locationProvider.html5Mode(true);
    $urlRouterProvider.otherwise('/bbv/voorstellen/open');

    (...routing code)

}])

指令:

    .directive('bbvNav', [ '$state', ( $state ) => {
        return {
            restrict: 'E',
            template,
            scope: {
                titleBind: '&',
                onButtonClick: '&'
            },
            bindToController: true,
            controller: [ '$scope', function ( $scope ) {
                $state.go( <NAVIGATE TO URLROUTERPOVIDER.OTHERWISE> );
                console.log('Accessing $urlRouterProvider.otherwise state:'); // How do I get the value of $urlRouterProvider.otherwise here?
            }
        }
    })

5 个答案:

答案 0 :(得分:0)

我在这种情况下使用这种方法。 首先,我总是将我的默认状态置于常量中,所以每当我需要它时,我只需向控制器或服务注入常量即可使用它......

<强> CONSTANT

app.module('example').constant('defaultState','app.defaultState')

然后首先将其注入您的配置文件并与$urlprovider

一起使用

<强> CONFIG

$urlRouterProvider.otherwise(function ($injector, defaultState) {
    var $state = $injector.get('$state');
    $state.go(defaultState);
});

所以使用常量总是只需要注入你想要的任何组件并使用它......

控制器示例

.controller(defaultState){
   ... TODO ...
}

答案 1 :(得分:0)

我认为问题来自您指令中使用的命名。您应该更改注射名称:

.directive('bbvNav', [ '$stateProvider', '$urlRouterProvider', ( $state, $urlRouter ) => {
        return {
            restrict: 'E',
            template,
            scope: {
                titleBind: '&',
                onButtonClick: '&'
            },
            bindToController: true,
            controller: [ '$scope', function ( $scope ) {
                console.log('Accessing otherwise state:'); // How do I get the value of $urlRouterProvider.otherwise here?
            }
        }
    })

答案 2 :(得分:0)

确保将指令模块作为主应用程序模块的依赖项加载。例如使用:

angular.module('myApp', ['myApp.directive']);

注意

angular.module('ModuleName', [])   // creates a module.
angular.module('ModuleName')       // gets you a pre-existing module.

答案 3 :(得分:0)

我认为你不能在指令中注入提供者,只是在配置中... 但是如果你想访问controller / service / directive / ...中的当前路由,你可以注入$route并按如下方式使用它:

$route.current : {scope, params, templateUrl}

https://docs.angularjs.org/api/ngRoute/service/ $路线

同样在事件$routeChangeSuccess / $routeChangeStart中,您可以通过第二个参数

访问下一个路线

要获得更多支持,请告诉我,您需要哪些信息&#34;否则&#34;我们可以找到一个解决方案:)

更新

对不起,我跳过,你正在使用ui-router,我的答案是针对&#34; ngRoute&#34;,但我认为它非常相似。您应该可以通过$urlRouterProvider.otherwise

访问$state

更新

(function(){
    // wrap to prevent user to interact with
    var urlProvider;
    app.config(["$urlProvider", function(provider){
        urlProvider = provider;
    }]);
    app.directive([...]{
        console.log(urlProvider); // log provider to see if you can access otherwise ( like $$otherwise ), due to otherwise is a function
    })
})();

答案 4 :(得分:0)

在rootScope上存储state和stateParams

+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
    //UIGraphicsBeginImageContext(newSize);
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

使用$ state.go(&#34; state-name&#34;)到所需的状态

 .run(function($rootScope, $state, $stateParams){
          $rootScope.$state = $state;
          $rootScope.$stateParams = $stateParams;
        })

我试图用以下的plunker来证明

描述:单击State2或State 3然后单击Home按钮,其中一个将被重定向到主页。

demo to route to desired state