【问题标题】:TypeError: Cannot read property 'replace' of undefinedTypeError:无法读取未定义的属性“替换”
【发布时间】:2015-05-29 11:38:16
【问题描述】:

我在尝试将html5Mode 与 ui-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)

angular.js 中的那个段是:

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

路由文件:

(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);
        }
})();

我已经在 html 中设置了基本 url:

<base href="/app/" />

【问题讨论】:

  • 这些解决方案似乎不起作用。无论如何,我所有的网址都是小写的,所以我不确定这是否适用。
  • 所以url 是未定义的。查看堆栈跟踪,看看谁在调用trimEmptyHash。找到应该设置它的代码,看看为什么它是未定义的。
  • 您是否连接并缩小了您的 js 文件?确保你重新处理它们。 @alexkb answer 已经解决了这类问题。

标签: angularjs


【解决方案1】:

您的状态“应用程序”没有定义 url 键。

【讨论】:

    【解决方案2】:

    你必须从 html 文件中删除它

    <base href="/app/" />
    

    这来自 app.js 代码

    $locationProvider.html5Mode(true);
    

    【讨论】:

    • 是的,这会有所帮助,但如果您希望您的客户对您漂亮的 URL 留下深刻印象,那就不行了。
    • 太棒了!当我尝试使用它时,我将删除 html5Mode!你读过这个问题吗?
    【解决方案3】:

    我遇到了同样的问题,在我的情况下,传递给 trimEmptyHash() 的未定义“url”参数最终来自 $location 上的 $$absUrl 属性没有被初始化的事实。进一步挖掘,似乎 $$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;
    };
    

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

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

    【讨论】:

    • 我不敢相信 Angular 团队能做到这一点。这几乎不允许 HTML5 模式在除了简单路由之外的站点上使用,例如 Rails 或 ASP.NET 站点,其中公共文件夹甚至与路由文件不在同一个位置。
    • 抱歉,我上次的评论不正确。可以在 Angular 的 HTML5 模式下使用 Rails 等,但它使刚开始的团队和测试变得更加困难,因为他们不会设置路由并且必须使用旧的 API。再说一次,客户可能不会看到这些,希望团队能在他们看到的时候设置好路线。
    【解决方案4】:

    这里描述了你应该做什么: ui-router on GitHub 配置服务器端路由后,只要您避免使用以下网址打开您的网站,一切都应该正常:http://localhost/app-base#/

    【讨论】:

      【解决方案5】:

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

      <base href="app/" />
      

      到

      <base href="/app/" />
      

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

      【讨论】:

      • 我仔细检查了这一点,我的 / before 作为 / after,但导致我的问题是它区分大小写!确保它全部小写,这解决了我的问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多