TypeError:无法读取未定义的属性'replace'

bab*_*eii 13 angularjs

我尝试使用html5Modeui-router 时遇到上述错误.谁能指出我做错了什么?

TypeError: Cannot read property 'replace' of undefined
    at bd (angular.js:10555)
    at Object.<anonymous> (angular.js:11403)
    at l.$get.l.$digest (angular.js:14222)
    at l.$get.l.$apply (angular.js:14493)
    at angular.js:1449
    at Object.e [as invoke] (angular.js:4182)
    at d (angular.js:1447)
    at sc (angular.js:1467)
    at Jd (angular.js:1361)
    at HTMLDocument.<anonymous> (angular.js:26086)
Run Code Online (Sandbox Code Playgroud)

该部分angular.js是:

10554 function trimEmptyHash(url) {
10555   return url.replace(/(#.+)|#$/, '$1');
10556 }
Run Code Online (Sandbox Code Playgroud)

路由文件:

(function(){

    'use strict';

    angular
        .module('app')
        .config(routes);

        routes.$inject = ['$stateProvider', '$locationProvider'];

        function routes($stateProvider, $locationProvider) {

            // Configure app states
            $stateProvider

                .state('app', {
                    abstract: true, 
                    templateUrl: 'modules/app/app.html',                
                    controller: 'AppController'
                })

                .state('app.home', {
                    url: '/',
                    templateUrl: 'modules/home/index.html'
                });

            $locationProvider.html5Mode(true);
        }
})();
Run Code Online (Sandbox Code Playgroud)

我在html中设置了基本网址:

<base href="/app/" />
Run Code Online (Sandbox Code Playgroud)

Sea*_*ean 11

我遇到了同样的问题,在我的情况下,传递给trimEmptyHash()的未定义的"url"参数最终来自于$ location的$ absUrl propery没有被初始化.进一步深入研究,似乎$$ absUrl通常在$$ compose()方法中初始化,该方法通常从$$ parse()调用,通常从$$ parseLinkUrl()方法调用.这是$$ parseLinkUrl()(查看Angular 1.4.1):

this.$$parseLinkUrl = function(url, relHref) {
  if (relHref && relHref[0] === '#') {
    // special case for links to hash fragments:
    // keep the old url and only replace the hash fragment
    this.hash(relHref.slice(1));
    return true;
  }
  var appUrl, prevAppUrl;
  var rewrittenUrl;

  if ((appUrl = beginsWith(appBase, url)) !== undefined) {
    prevAppUrl = appUrl;
    if ((appUrl = beginsWith(basePrefix, appUrl)) !== undefined) {
      rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl);
    } else {
      rewrittenUrl = appBase + prevAppUrl;
    }
  } else if ((appUrl = beginsWith(appBaseNoFile, url)) !== undefined) {
    rewrittenUrl = appBaseNoFile + appUrl;
  } else if (appBaseNoFile == url + '/') {
    rewrittenUrl = appBaseNoFile;
  }
  if (rewrittenUrl) {
    this.$$parse(rewrittenUrl);
  }
  return !!rewrittenUrl;
};
Run Code Online (Sandbox Code Playgroud)

在我的例子中,最后的"if"子句没有触发对$$解析的调用,因为"rewrittenUrl"从未得到一个值,因为中间的if/else if子句都没有解析为true.在我的情况下,这是因为我用来为应用程序提供的URL(CompanyName/admin.html)实际上高于我为应用程序设置的基本Href(CompanyName/admin /),所以没有一个条件解析为true .只要我将基本Href更改为CompanyName /,我就不再遇到此问题.

或者,您可以在位置原型上初始化$$ absUrl,或等待Angular的某种修复 - 观看此问题,并查看joelmdev在3月30日提出的解决方法.

  • 我不敢相信Angular团队那样做了.除了简单路由之外,这几乎不允许在网站上使用HTML5模式,例如Rails或ASP.NET站点,其中公用文件夹甚至与路由文件不在同一个位置. (2认同)

ale*_*xkb 6

TypeError: Cannot read property 'replace' of undefined在使用html5mode时我也看到了完全相同的错误,直到我改变了:

<base href="app/" />
Run Code Online (Sandbox Code Playgroud)

<base href="/app/" />
Run Code Online (Sandbox Code Playgroud)

注意,错过了前面的斜线.希望这可以帮助别人.

  • 我仔细检查了这个,并且我的/之前是/之后,但是导致我的问题的是,它是区分大小写的!确保它全部小写,这解决了我的问题 (5认同)

MrE*_*MrE 0

您的状态“app”没有定义 url 键。