48

Angular で最初の Web アプリを作成しようとしています。

通常モード (html5Mode オフ) では、Angular はアドレスのハッシュ部分を強制的に「パス」のように見せ (先頭に「/」を追加)、特殊文字をエンコードします。たとえば、単一の「?」を許可します。および "#" をハッシュに追加し、その他を %3F と %23 に置き換えます。

この機能をオフにする方法はありますか? $locationProvider / $routeProvider機能を使用したくない- 自分でハッシュを解析したい (私の場合、ユーザーはハッシュに「自由なテキスト」を入力して Web サイト内を検索します)。

正規表現を使用するように routeProvider を構成できないことを読みました...

htmlMode がオンになっている場合、アドレスのハッシュ部分は強制的にパスのように見えることはありませんが (先頭に "/" がありません)、それでも特殊文字がエンコードされます。

とにかく特殊文字をエンコード/エスケープするブラウザがあることは承知していますが、ユーザーがアドレスバーに特殊文字を入力できた場合、それを変更したくありません。

ありがとう

4

5 に答える 5

67

これの副作用はわかりませんが、仕事は完了します。意図した場合でも、angular アプリからのすべての位置操作が無効になることに注意してください。

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

ES6 バリアント:

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

            return $delegate;
        }]);
    }]);

Chrome 30、IE9、IE10 でテスト済み。https://stackoverflow.com/a/16678065/369724
に触発

于 2013-11-07T00:31:06.440 に答える
5

angular.js のローカル コピーを使用します。検索する

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

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

対応する行をコメントアウトすると、angularjs は場所の URL の変更を監視しなくなります。

于 2015-01-12T03:13:39.230 に答える
2

@greg.kindel の回避策 (受け入れられた解決策) はうまくいきませんでした。無限のダイジェスト ループに関する多くのエラーがスローされました。Angular 1.5.8 を使用しています。

その回避策を次のように調整して、機能させることができました。それが他の誰かの悲しみを救うことを願っています。

angular.module('sample', [])
  .config(['$provide', function ($provide) {
    $provide.decorator('$browser', ['$delegate', '$window', function ($delegate, $window) {
      $delegate.onUrlChange = function () {};
      //
      // HACK to stop Angular routing from manipulating the URL
      //
      // The url() function seems to get used in two different modes.
      //
      // Mode 1 - Zero arguments
      // There are no arguments given, in which case it appears that the caller is expected the
      // browser's current URL (a string response).
      //
      // Mode 2 - Three arguments
      // It receives three arguments (url, some_boolean, null).  It seems the caller is expecting
      // the browser's URL to be updated to the given value.  The result of this function call is
      // expected to be the $delegate itself, which will subsequently get called with no arguments
      // to check the browser's URL.
      //
      // The Hack:
      // We save the URL so that we can lie to the caller that the URL has been updated to what was
      // requested, but in reality, we'll do nothing to alter the URL.
      //
      var savedUrl = null
      $delegate.url = function (url, ...args) {
        if (!!url) {
          savedUrl = url;
          return $delegate;
        } else {
          return !!savedUrl ? savedUrl : $window.location.href;
        }
      };
      return $delegate;
    }]);
  }])
于 2020-04-29T15:35:47.677 に答える