2

ステートマシンが含まれている新しい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

4

1 に答える 1

2

私は通常、この性質の問題を抽象的な状態と入れ子で解決します。url パラメーターに基づいて変更されない部分を抽象的な親状態に配置すると、余分なサーバー ヒットを回避できます。親状態の解決またはカスタム データ セクションに配置することを好みますが、必要に応じて、スコープの継承を介してそれらを取得できます。(少なくとも私にとっては) 予想外のことがいくつかあるので、必ずスコープ継承のルールを読んで理解してください。

詳細については、https ://github.com/angular-ui/ui-router/wiki/Nested-States-%26-Nested-Views を参照してください。さらに、angular-ui に含まれるサンプル アプリケーションは、状態の入れ子を理解するのに適した場所です。

于 2013-10-16T22:22:40.620 に答える