ステートマシンが含まれている新しいangular-ui ルーターを使用しています ( https://github.com/angular-ui/ui-router )。この優れたルーターにより、ユーザーは URL の一部としてパラメーターを指定できます。
例えば:
$stateProvider
.state('contacts.detail', {
url: "/contacts/:contactId",
templateUrl: 'contacts.detail.html',
controller: function ($stateParams) {
// If we got here from a url of /contacts/42
expect($stateParams).toBe({contactId: 42});
}]
})
(こちらをご覧ください)
これは、ユーザーが /contacts/42 に移動すると、状態が「contacts.details」に変更され、42 パラメーターがコントローラーに挿入されることを意味します。
しかし、問題があります。url パラメーターのみが変更された場合でも、transitionTo 関数は引き続き呼び出されます (たとえば、url が手動で変更された場合、または入力ボックスにバインドされた場合に発生する可能性があります)。これは、その状態のビュー ディレクティブを再作成することにつながります。その状態で何かを更新したいだけであれば、時間の無駄と問題の両方になります。
わざとらしい。コードから:
// Starting from the root of the path, keep all levels that haven't changed
var keep, state, locals = root.locals, toLocals = [];
for (keep = 0, state = toPath[keep];
state && state === fromPath[keep] && equalForKeys(toParams, fromParams, state.ownParams);
keep++, state = toPath[keep]) {
locals = toLocals[keep] = state.locals;
}
equalForKeys はパラメーターを比較するもので、違いがある場合は false を返します。
私の質問: 著者がこのように書いた理由を知っていますか? パラメータのみが変更される場合に遷移がないように、変更しても安全だと思いますか?
ここまで読んでくれてありがとう
リオール
編集:これは仕様によるものと思われます。ちょうど見つかった: https://github.com/angular-ui/ui-router/issues/46