在某些情况下,我想导航到默认或“其他”状态。所以我需要从控制器获取路由对象中配置的其他状态。
当我尝试在我的指令的控制器中注入$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?
}
}
})
答案 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按钮,其中一个将被重定向到主页。