ui-router $state.go VS ui-sref 让我在 AngularJS 中发疯

问题描述:

通过 ui-sref 调用时有效

It works when called via ui-sref

<a class="button" ui-sref="main.create">

但是当使用 ng-click 和 $stage.go 调用它时,它会被调用并呈现页面,但我的 $urlRouterProvider.otherwise 将再次覆盖 DOM.我在一步一步调试的时候注意到了.它可能认为 main.create 是一个不存在的 url.

but when it's called using ng-click and $stage.go, it's called and renders the page but my $urlRouterProvider.otherwise will override the DOM again. I noticed it when I debugged step by step. It maybe thinks that main.create is a non-existent url.

这里是 ng-click 的代码和函数.

here is the code and function for ng-click.

<a href="#" ng-click="create()">Create Object</a>

这里是 create() 函数

and here is create() function

$scope.create = function() {
  $state.go('main.create');
};

当使用 ng-click="create()" 时,它正在调用 $state.go('main').但在它调用 $state.go('main') 之前,我在 DOM 中看到了正确的 main.create 页面渲染.我写了那个IF"语句来处理不存在的 url,以便它们被重定向回主页.这是我的 config.js.

It's calling $state.go('main') when ng-click="create()" is used. But before it calls $state.go('main'), I see the proper main.create page render in DOM. I wrote that "IF" statement to handle non-existent url so they get redirected back to main page. Here is my config.js.

  .state('main', {
    url: '/',
    views: {
      '@': {
        templateUrl: 'app/main/main.html',
        controller: 'MainController'
      },
      'content@main' : {
        templateUrl: 'app/main/main.display.html'
      }
    }
  })

  .state('main.create', {
    url: '/create',
    views: {
      'content@main' : {
        templateUrl: 'app/main/main.create.html'
      }
    }
  })

  $urlRouterProvider.otherwise(function ($injector) {
  var Session = $injector.get('Session');
  var $state = $injector.get('$state');
  if (Session.isAuthenticated()) {
    $state.go('main'); // <-- this is what gets called when using ng-click and after main.create partial gets rendered
  } else {
    $state.go('login');
  }
});

出现这种情况是因为您在同一个锚标记上触发了一个操作和一个路由.在 中,您不需要 hrefng-click 出现.将其更改为 <a ng-click="create()">,或者如果需要使用 href,请将其设置为空,例如 <a href="" ng-click="create()">.

This is occurring because you are triggering an action and a route on the same anchor tag. In <a href="#" ng-click="create()">, you don't need both href and ng-click to be present. change it to <a ng-click="create()">, or if having the href is necessary, set it to empty, like <a href="" ng-click="create()">.