TypeError: Не удается прочитать свойство "replace" из undefined

Я получаю вышеуказанную ошибку при попытке использовать 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);
        }
})();

Я установил базовый url в html:

<base href="/app/" />

Ответ 1

Я столкнулся с той же проблемой, и в моем случае аргумент "url", передаваемый trimEmptyHash(), в конечном итоге исходил из того факта, что $$ absUrl propertyy на $location не инициализировался. Копаясь дальше, кажется, что $$ 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" не вызывало вызов анализа $$, потому что "rewrittenUrl" никогда не получало значения, потому что ни одно из предложений if/else if в середине не было равно true. В моем случае это было потому, что URL-адрес, который я использовал для обслуживания приложения (CompanyName/admin.html), был фактически выше базового Href, установленного для приложения (CompanyName/admin/), поэтому ни один из условных выражений не был принят к истинному, Как только я сменил базу Href на просто имя_компании/, я больше не сталкивался с этой проблемой.

В качестве альтернативы вы можете инициализировать $$ absUrl в прототипе местоположения или подождать какое-то исправление от Angular - смотреть эту проблему, и см. обходной путь, предложенный joelmdev 30 марта.

Ответ 2

Я тоже видел эту ту же ошибку TypeError: Cannot read property 'replace' of undefined при использовании html5mode, пока не изменил:

<base href="app/" />

к

<base href="/app/" />

Обратите внимание, пропущенная предыдущая косая черта. Надеюсь, это поможет кому-то.

Ответ 3

В вашем состоянии "приложение" не указан ключ URL.

Ответ 4

То, что вам нужно сделать, описано здесь: ui-router на GitHub Как только вы настроите маршрутизацию на стороне сервера, все должно работать нормально, пока вы не открываете свой сайт с помощью URL-адреса: http://localhost/app-base#/

Ответ 5

вам нужно удалить это из html файла

<base href="/app/" />

и это из кода app.js

$locationProvider.html5Mode(true);