How would I have ui-router go to an external link, such as google.com?

匿名 (未验证) 提交于 2019-12-03 03:02:02

问题:

For example:

 $stateProvider             .state('external', {                 url: 'http://www.google.com',              }) 

url assumes that this is an internal state. I want it to be like href or something to that effect.

I have a navigation structure that will build from the ui-routes and I have a need for a link to go to an external link. Not necessarily just google, that's only an example.

Not looking for it in a link or as $state.href('http://www.google.com'). Need it declaratively in the routes config.

回答1:

Angular-ui-router doesn't support external URL, you need redirect the user using either $location.url() or $window.open()

I would suggest you to use $window.open('http://www.google.com', '_self') which will open URL on the same page.

Update

You can also customize ui-router by adding parameter external, it can be true/false.

  $stateProvider   .state('external', {        url: 'http://www.google.com',        external: true   }) 

Then configure $stateChangeStart in your state & handle redirection part there.

Run Block

myapp.run(function($rootScope, $window) {   $rootScope.$on('$stateChangeStart',     function(event, toState, toParams, fromState, fromParams) {       if (toState.external) {         event.preventDefault();         $window.open(toState.url, '_self');       }     }); }) 

Sample Plunkr

Note: Open Plunkr in a new window in order to make it working, because google doesn't get open in iFrame due to some security reason.



回答2:

You could use the onEnter callback:

 $stateProvider     .state('external', {         onEnter: function($window) {             $window.open('http://www.google.com', '_self');         }     }); 

Edit

Building on pankajparkar's answer, as I said I think you should avoid overriding an existing param name. ui-router put a great deal of effort to distinguish between states and url, so using both url and externalUrl could make sense...

So, I would implement an externalUrl param like so:

myApp.run(function($rootScope, $window) {     $rootScope.$on(         '$stateChangeStart',         function(event, toState, toParams, fromState, fromParams) {             if (toState.externalUrl) {                 event.preventDefault();                 $window.open(toState.externalUrl, '_self');             }         }     ); }); 

And use it like so, with or without internal url:

$stateProvider.state('external', {     // option url for sref     // url: '/to-google',     externalUrl: 'http://www.google.com' }); 


回答3:

As mentioned in angular.js link behaviour - disable deep linking for specific URLs you need just to use

link to external 

this will disable angularJS routing on a specific desired link.



回答4:

I transformed the accepted answer into one that assumes the latest version of AngularJS (currently 1.6), ui-router 1.x, Webpack 2 with Babel transpilation and the ng-annotate plugin for Babel.

.run(($transitions, $window) => {   'ngInject'   $transitions.onStart({     to: (state) => state.external === true && state.url   }, ($transition) => {     const to = $transition.to()     $window.open(to.url, to.target || '_self')     return false   }) }) 

And here's how the state may be configured:

.config(($stateProvider) => {   'ngInject'   $stateProvider     .state({       name: 'there',       url:'https://google.com',       external: true,       target: '_blank'     }) }) 

Usage:

To Google 


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