32

現在、AngularJS フレームワークをいじっています。シングルページ アプリケーションへのディープ リンクに $route サービスを使用しています。

ここで、現在の URL の検索部分だけを変更して、アプリケーション内をナビゲートしたいと考えています。JavaScript で $location サービスを使用すると簡単に実行できますが、検索部分だけを置き換えて現在のルートから href 属性を構築するにはどうすればよいでしょうか?

手動で行う必要がありますか、それとも AngularJS の方法はありますか?

追加した:

もちろん、$location サービスには、そのような URL を計算するすべてのメソッドがあります。しかし、$location はブラウザー ウィンドウを新しい URL にナビゲートするため、使用できません。

手動で URL を作成することには、別の問題があります。従来の # メソッドが使用されているか、新しい History API が使用されているかを確認する必要があります。これに応じて、URL に # 記号を含める必要があります。

4

3 に答える 3

13

ロバートの答えに続いて、Angular.js で関数を見つけました。それらは、buildUrl、forEachSorted、および sortedKeys です。また、builUrl は公開されている isObject および toJson 関数も使用するため、それぞれ angular.isObject および angular.toJson に変更する必要があります。

function forEachSorted(obj, iterator, context) {
    var keys = sortedKeys(obj);
    for (var i = 0; i < keys.length; i++) {
        iterator.call(context, obj[keys[i]], keys[i]);
    }
    return keys;
}

function sortedKeys(obj) {
    var keys = [];
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            keys.push(key);
        }
    }
    return keys.sort();
}

function buildUrl(url, params) {
    if (!params) return url;
    var parts = [];
    forEachSorted(params, function (value, key) {
        if (value == null || value == undefined) return;
        if (angular.isObject(value)) {
            value = angular.toJson(value);
        }
        parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
    });
    return url + ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');
}
于 2013-10-13T01:56:20.917 に答える
3

ここのソースコード (v.1.1.0) でわかるように:

https://github.com/angular/angular.js/blob/v1.1.0/src/ngResource/resource.js#L228

そしてここ:

https://github.com/angular/angular.js/blob/v1.1.0/src/ngResource/resource.js#L247

Angularjs は、URI 文字列を管理するために内部でencodeURIComponentを使用しませんが、使用された関数を利用できるようにもしません。これらの関数はモジュールの内部にあります (私が思うに残念なことです)。

AngularJS とまったく同じ方法で URI を管理したい場合は、これらの関数をソースからコードにコピーして、そのための独自のサービスを作成できます。

于 2012-10-15T13:16:13.200 に答える