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

时间:2015-05-03 20:54:46

标签: angularjs angular-ui-router

通过ui-sref

调用时有效
<a class="button" ui-sref="main.create">

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

这是ng-click的代码和功能。

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

这里是create()函数

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

在使用$state.go('main')时调用ng-click="create()"。但在调用$state.go('main')之前,我在DOM中看到了正确的main.create页面呈现。我写了那个&#34; IF&#34;用于处理不存在的url的语句,以便将它们重定向回主页面。这是我的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');
  }
});

2 个答案:

答案 0 :(得分:6)

这是因为您在同一个锚标记上触发操作和路径。在<a href="#" ng-click="create()">中,您不需要同时hrefng-click。将其更改为<a ng-click="create()">,或者如果需要href,请将其设置为空,例如<a href="" ng-click="create()">

答案 1 :(得分:0)

Claies是正确的,问题源于在同一个标​​签上同时使用href和ng-click,但正确的解决方案是确保你的$ scope.create()函数在紧接着之后立即返回false布尔值。调用$ state.go,然后href可以是你想要的任何东西,并将被忽略。

一般情况下(甚至在角度外),如果锚标签同时具有href和click事件处理程序,它将执行它们,首先是click事件处理程序,然后是href - 除非click事件handler返回false值,然后它有效地取消href执行。如您所述,不同的浏览器执行href =&#34;#&#34;和/或href =&#34;&#34;不同的是,如果你的$ scope.create()函数返回false,它就不会成为问题。