これまでのところ私の主なコントローラに$場所の依存関係を追加すると$ location.hashが ''を返し、$ location.pathが '/ path#sectionId'を返します。これに基づき
は
、我々はコントローラの先頭に次のようなものを追加することができます。
// when has in url is encoded to %23, location.hash does not recognize it, and it gets cleared from the path in $RouteProvider
var holdHash = $location.path();
holdHash = holdHash.split('#');
if (holdHash.length > 1) { // if it has an item after the hash in the array
$location.hash(holdHash.pop()); //take that item and use it as a hash
}
しかし、あなたは、$ location.search
に値を失うか、この操作を行うことができます:
を
$location.url(decodeURIComponent($location.url()))
あなたの検索も保持しますが、 '?'を置き換えます。 '%3F'を入力して$ location.searchではなく$ location.ashに返します。
彼らはハックソリューション何とか少しあり、かつ完全に****
***** EDIT 2 SOLUTION($のlocation.searchの問題を参照)
ように動作しません。私の問題の最終的な解決策は、IDを格納しているサービスを更新し、メインコントローラのハッシュ検出の最初のことをトリガします。また、更新インクルードを念頭に格納することができるすべてのバリエーションを維持するための検出があります。
/**
* tries to get hash from $location
* if unavailable tries to look for encoded hash
* if unavailable returns null
* @return {string or null} [a string with the id of the section or null]
*/
function getHashID() {
var fromLoc = $location.hash(),
fromEncodedUrl,
inPath;
if (fromLoc.length) {
return fromLoc;
}
// iphone Chrome encodes the pound sign on redirect
fromEncodedUrl = $location.url();
fromEncodedUrl = fromEncodedUrl.split('%23');
if (fromEncodedUrl.length > 1) {
return fromEncodedUrl.pop();
}
inPath = $location.path();
inPath = inPath.split('#');
if (inPath.length > 1) {
return inPath.pop();
}
return null;
}
私はそれ以降のサービスオブジェクトに格納されている値でアニメーションをトリガーする、または新しい値を取得し、アニメーションの後私はサービスの価値をクリアします。