【问题标题】:Controller loads twice when wildcard path is unencoded通配符路径未编码时控制器加载两次
【发布时间】:2015-11-03 16:34:15
【问题描述】:

我有一个状态可以解析通配符path,它代表应用程序的实际路径。例如,url: '/{path:.*}' 其中pathabc/def/path 是通过编程方式构建的。

如果我对 path 进行编码,则状态控制器会按预期执行一次,但 URL 以编码路径结束(即,我看到的是 mydomain.com/abc%252Fdef%252F 而不是 mydomain.com/abc/def/)。但是,如果我对其进行编码,控制器会运行两次。

为什么控制器运行两次?我需要做什么才能让abc/def/etc.../ 这样的路径在我的浏览器中显示未编码?

参见示例。如果path 未编码,则单击“Go”会更改状态并且控制器会记录到控制台两次。

编辑:显然它是known issue with ui-router. 建议的解决方法是像我提到的那样对路径进行编码。

var app = angular.module('routerApp', ['ui.router']);

app.config(function($stateProvider) {
  $stateProvider
      .state('abc', {
          url: '/{path:.*}',
          controller: function() {
            console.log('loaded');
          }
      });
});

app.controller('MainCtrl', function($scope, $state) {
  $scope.go = function() {
    
    // loads once
    //var path = encodeURIComponent('one/two/three/four/');
    
    // loads twice
    var path = 'one/two/three/four/';
    
    $state.go('abc', {path: path});
  };
});
<html ng-app="routerApp">

  <head>
    <script data-require="angular.js@1.4.x" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.js" data-semver="1.4.7"></script>
    <script data-require="ui-router@*" data-semver="0.2.15" src="//rawgit.com/angular-ui/ui-router/0.2.15/release/angular-ui-router.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <button ng-click="go()">GO</button>
    <div class="container">
      <div ui-view>
      </div>
    </div>
  </body>

</html>

【问题讨论】:

    标签: angularjs angular-ui-router


    【解决方案1】:

    $routeProvider 不支持标准正则表达式,但它支持 支持命名组

    Angular restriction

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多