2015-03-25 35 views
12

sto ottenendo l'errore precedente quando si cerca di utilizzare html5Mode con ui-router. Qualcuno può indicarmi cosa sto sbagliando?TypeError: Impossibile leggere la proprietà 'replace' di indefinito

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) 

Questo segmento è angular.js:

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

Il file di instradamento:

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

ho impostato l'URL di base nel codice HTML:

<base href="/app/" /> 
+0

http://stackoverflow.com/questions/28859276/locationprovider-html5modetrue-issues e http://stackoverflow.com/questions/21863670/case-insensitivity-with-angularjs-ui-router –

+0

Tali soluzioni non sembra funzionare. Tutti i miei URL sono in minuscolo, quindi non sono sicuro che sia applicabile. – babbaggeii

+1

Quindi 'url' non è definito.Guarda in basso la traccia dello stack e vedi chi sta chiamando 'trimEmptyHash'. Trova il codice che dovrebbe impostarlo e vedere perché è indefinito. –

risposta

0

tuo stato 'app' non ha alcuna definizione di chiave url d.

-5

è necessario rimuovere questo dal file html

<base href="/app/" /> 

e questo da app.js codice

$locationProvider.html5Mode(true); 
+4

Sì, questo aiuta, ma non se vuoi che i tuoi clienti siano impressionati dai tuoi bei URL. – trysis

+2

Brillante! Rimuoverò html5Mode quando cerco di usarlo! Hai mai letto la domanda? – Silveraven

11

Ho incontrato lo stesso problema, e nel mio caso l'indefinito "url" argomento essere passato a trimEmptyHash() alla fine proveniva dal fatto che $$ absUrl propery su $ location non veniva inizializzato. Scavando ulteriormente, sembra che $$ absUrl venga normalmente inizializzato nel metodo $$ compose(), che viene tipicamente chiamato da $$ parse() che viene tipicamente chiamato dal metodo $$ parseLinkUrl(). Ecco $$ parseLinkUrl() (guardando 1.4.1 angolare):

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

Nel mio caso, la finale "se" clausola non è stata innescando la chiamata a $$ analizzare, perché "rewrittenUrl" non ha mai avuto un valore, perché nessuna delle clausole if/else if nel mezzo è stata risolta in true. Nel mio caso, era perché l'url che stavo usando per servire l'app (CompanyName/admin.html) era in realtà sopra l'Href di base che ho impostato per l'app (CompanyName/admin /), quindi nessuno dei condizionali è stato risolto a true . Non appena ho cambiato la mia base Href con CompanyName /, non ho più riscontrato questo problema.

In alternativa, è possibile inizializzare $$ absUrl sul prototipo della posizione oppure attendere qualche tipo di correzione da Angular - guarda this issue e vedere la soluzione proposta da joelmdev il 30 marzo.

+2

Non posso credere che il team di Angular lo abbia fatto. Tutto questo non consente la modalità HTML5 su siti con qualcosa di più del semplice routing, ad esempio Rails o siti ASP.NET in cui la cartella pubblica non si trova nemmeno nella stessa posizione dei file di routing. – trysis

+0

Siamo spiacenti, non ero corretto sul mio ultimo commento. È possibile utilizzare Rails, ecc. Con la modalità HTML5 di Angular, ma rende più difficile l'inizio di team e test, poiché non avranno i loro percorsi impostati e devono utilizzare la vecchia API. Quindi, di nuovo, i clienti probabilmente non li vedranno, e speriamo che i team organizzino le loro rotte prima che lo facciano. – trysis

6

ciò vedevo esattamente lo stesso TypeError: Cannot read property 'replace' of undefined errore quando utilizza html5mode troppo, fino a quando ho cambiato:

<base href="app/" /> 

a

<base href="/app/" /> 

Nota, la barra precedente persa. Spero che questo possa aiutare qualcuno.

+4

L'ho verificato due volte, e il mio ha avuto/prima come/dopo, ma ciò che ha causato il mio problema è che è sensibile al maiuscolo/minuscolo! Assicurati che sia tutto in minuscolo, che ha risolto il mio problema – Gillardo

Problemi correlati