2013-02-21 18 views
10

Sto faticando a capire perché la mia base href sembra essere case sensitive. Ho una pagina con una base href e utilizza il routing angularjs.AngularJS + Base Href Case sensitive?

html:

<html ng-app="app"> 
    <head> 
     <base href="/Foo/"/> 
    </head> 
    <body> 
     <div>Foo</div> 
     <div ng-view></div> 
    </body> 
</html> 

js:

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

module.config(function ($routeProvider, $locationProvider) { 
    $routeProvider 
     .when('/Home/Page1', { templateUrl = 'partials/page1' }) 
     .otherwise({ redirectTo: '' }); 

    $locationProvider.html5Mode(true); 
    $locationProvider.hashPrefix('!'); 
}); 

Se ci si dirige verso http://www.example.com/Foo/, va bene. Ma quando ci si dirige a http://www.example.com/foo/ ottengo un errore angolare:

Error: Invalid url "http://www.example.com/foo/", missing path prefix "/Foo" ! 
at Error (<anonymous>) 
at Object.LocationUrl.$$parse (http://www.example.com/foo/Scripts/angular.js:4983:13) 
at Object.LocationUrl (http://www.example.com/foo/Scripts/angular.js:5014:8) 
at $LocationProvider.$get (http://www.example.com/foo/Scripts/angular.js:5387:21) 
at Object.invoke (http://www.example.com/foo/Scripts/angular.js:2809:28) 
at http://www.example.com/foo/Scripts/angular.js:2647:37 
at getService (http://www.example.com/foo/Scripts/angular.js:2769:39) 
at Object.invoke (http://www.example.com/foo/Scripts/angular.js:2787:13) 
at $CompileProvider.directive (http://www.example.com/foo/Scripts/angular.js:3613:43) 
at Array.forEach (native) angular.js:5582 

Se aiuta/fa la differenza, sito è ospitato su IIS e l'utilizzo di MVC 4.

+0

FYI vostro href di base non è valido. Secondo le specifiche, deve essere un url assoluto. – richb

risposta

12

È necessario disattivare caso sensibilità del angularjs fornitore di percorso.

Ti invitiamo a controllare i dettagli di questa funzionalità: add caseInsensitiveMatch option for url matching

+0

Interessante, quella correzione da sola non lo ha fatto. Ho anche dovuto apportare modifiche alla linea: 'if (match.path.toLowerCase(). IndexOf (pathPrefix.toLowerCase())! == 0) {' Per aggiungere il toLowerCase, mentre stava lanciando Lì anche. – Tris

+0

Tris, dove hai modificato questa linea? Stai modificando angular.js? – lostpacket

+0

Questo era su 1.0.7, erano le linee 5121 e 5150 di angular.js: if (match.path.toLowerCase(). IndexOf (pathPrefix.toLowerCase())! == 0) { – Tris

2

una buona soluzione a questo problema è creare un decoratore per $ route e impostare le regole su come maiuscole e minuscole. In questo modo non è necessario creare il campo caseInsensitiveMatch per ogni "quando". In questo URL è possibile trovare ulteriori informazioni su questa soluzione: http://iranreyes.com/angularjs-decorating-route

0

La risposta accettata non funzionerà poiché ciò influisce solo sui percorsi e non sull'URL di base. Questo è un bug che sembra essere "troppo difficile" da risolvere per gli sviluppatori Angular. Riferimento - https://github.com/angular/angular.js/issues/4056

Per risolvere questo problema da soli è necessario riscrivere la funzione di beginsWith() in angular.js per confrontare il minuscolo -

function beginsWith(begin, whole) { 
 
\t if (whole.toLowerCase().indexOf(begin.toLowerCase()) === 0) 
 
\t { 
 
    return whole.substr(begin.length); 
 
    } 
 
}

7

sto usando UI- router, quindi non è stato in grado di risolvere la distinzione tra maiuscole e minuscole utilizzando i metodi suggeriti per ngRoute. La soluzione a https://github.com/angular-ui/ui-router/issues/197 ha funzionato per me per i percorsi ma non per il problema di base href che era il problema originale pubblicato.

Sono stato in grado di risolvere questo problema aggiungendo un decoratore per $ browser che imposta basehref e url in lettere minuscole. Se osservi l'origine dei valori confrontati che causano i problemi nel metodo startsWith che causa il problema, vedrai che alla fine provengono da $ browser.

In definitiva, la soluzione risolta per entrambe le route e la sensibilità del caso href di base e il suggerimento $ urlRouterProvider non era necessario. Quindi, se non hai un elemento href di base impostato in modo esplicito nel tuo DOM, la regola $ urlRouterProvider suggerita in quel collegamento risolverà il tuo problema. Altrimenti, questo risolve sia per href di base che per percorsi.

soluzione completa, che ha risolto il problema per entrambi href di base e il routing utilizzando ui-router:

$provide.decorator('$browser', [ 
        '$delegate', function($delegate) { 

         var _baseHref = $delegate.baseHref, 
          _url = $delegate.url; 

         $delegate.baseHref = function() { 
          return angular.lowercase(_baseHref()); 
         }; 
         $delegate.url = function(url, replace) { 
          // no need to modify the setter 
          if (url) { 
           return _url(url, replace); 
          } 
          // just lowercase the getter 
          return angular.lowercase(_url()); 
         }; 
         return $delegate; 
        } 
       ]); 
+0

Quando provo solo a modificare il baseHref questo causerà errori in IE 9. – Hama

+0

Non ho capito perché, ma quando provo questo, comincio a ricevere errori digest infiniti ogni volta Clicco su un collegamento ui-sref. – ctb

+0

Sai se questo è mai stato risolto? Funziona con il tuo decoratore, ma senza il tuo decoratore e solo questo '$ urlMatcherFactoryProvider.caseInsensitive (true);' non funziona. – ghiscoding

3

aveva lo stesso problema, ma hanno una soluzione diversa. Questo funziona per me e non interferisce con il routing, inizia con o supponendo che le cose siano/debbano essere in minuscolo.

Metti questa prima angolare viene inizializzato (come nella testa della pagina HTML)

// Fix base url being case sensitive 
(function() { 
    var base = document.querySelector("base"); 
    var normalized = RegExp(base.href, "i").exec(location.href); 
    base.href = normalized ? normalized[0] : base.href; 
}()); 
Problemi correlati