40

Ich versuche meine erste Web-App mit Angular zu schreiben.URL Manipulation in AngularJS deaktivieren

Im normalen Modus (html5Mode off) zwingt Angular den Hash-Teil der Adresse so, dass er wie ein "Pfad" aussieht (fügt ein führendes "/" hinzu) und codiert Sonderzeichen - zum Beispiel erlaubt er ein einzelnes "?" und "#" im Hash und ersetzt die anderen mit% 3F und% 23.

Gibt es eine Möglichkeit, diese Funktion auszuschalten? Ich möchte nicht die $ locationProvider/$ routeProvider Funktionen verwenden - Ich möchte den Hash selbst analysieren (In meinem Fall wird der Benutzer einige "Freitext" im Hash eingeben, um in meiner Website zu suchen).

ich gelesen, dass die routeProvider nicht verwenden reguläre Ausdrücke konfiguriert werden ...

Wenn htmlMode eingeschaltet wird, dann wird der Hash-Teil Adresse ist wie ein Weg zu suchen nicht gezwungen (keine führende „/“), aber es codiert immer noch Sonderzeichen.

Ich bin mir bewusst, dass einige Browser die Sonderzeichen sowieso codieren/entziehen, aber wenn der Benutzer einige Sonderzeichen in seiner Adressleiste eingeben konnte, möchte ich es nicht ändern.

Dank

Antwort

58

Nicht der Nebenwirkungen dieser sicher, aber es bekommt den Job getan. Beachten Sie, dass dadurch die Manipulation aller Orte in der eckigen App deaktiviert wird, selbst wenn dies beabsichtigt ist.

angular.module('sample', []) 
    .config(['$provide', function ($provide){ 
     $provide.decorator('$browser', ['$delegate', function ($delegate) { 
      $delegate.onUrlChange = function() {}; 
      $delegate.url = function() { return ""}; 
      return $delegate; 
     }]); 
    }]); 

Getestet in Chrome 30, IE9, IE10.
Inspiriert von https://stackoverflow.com/a/16678065/369724

+0

Huh, ich habe diese Feature-Idee vor langer Zeit aufgegeben ... Nur für den Rekord, ich akzeptiere deine Antwort, obwohl ich es nicht getestet habe. – Oren

+1

Danke. Hoffentlich wird jemand im angularjs-Team darüber stolpern und mir sagen, dass es einen richtigen Weg gibt. Diese Lösung hat viele Versuche/Fehler gemacht und wurde nicht gefunden, bis ich anfing, den Quellcode von angular zu lesen. Der Kunde ist jetzt glücklich, und ich werde das Framework so schnell wie möglich ausrangieren. Es ist ein beeindruckendes Spielzeug, aber es hat sich als unpraktisch erwiesen zu lernen und zu erweitern. –

+1

Winkelversuche zur Manipulation der Position, die zu einer Endlosschleife führt. – gronke

1

Wenn ich es richtig, Angular die Routing-Rückruf ist nicht verpflichtend, aber dann müssen Sie Nachladen-Controller, Ansichten kümmern usw.

+2

Es ist nicht obligatorisch, aber es ist immer an. Sie sehen dies, wenn Sie eine Seite haben (foo.html # abc). Wenn Sie neu laden, wird es (foo.html #/abc). Der Konflikt, den ich hatte, war mit der window.history API, die beim Gehen pushState (...);zurück vorwärts(); weil angular die url ersetzte, war die weiterleitungsgeschichte verloren - obwohl ich überhaupt kein routing im angularjs-teil der seite benutzte. –

+0

Ich würde versuchen benutzerdefinierte Angular Build, obwohl ich das selbst nie getan habe :) Der Teufel ist in der 'src/ng/location.js'. Der Verweis auf diese Datei sollte aus 'angularFiles.js' entfernt werden, damit Grunt sie nicht packt. Ich nehme an, Sie sollten auch den Verweis auf $ LocationProvider von src/AngularPublic.js entfernen, um Fehler zu vermeiden. – Adam

6

ich eine lokale Kopie Angularjs verwenden. Suche nach

$browser.onUrlChange(function(newUrl, newState) { 

und

$rootScope.$watch(function $locationWatch() { 

Kommentar die entsprechenden Leitungen und AngularJS out wird Uhr für die Lage url Änderungen zu stoppen.

+1

danke, wäre so einfach gewesen, in angularjs eine Option dafür zu machen –