почему маршрутизатор нового состояния angular-ui переходит, когда меняются только параметры?

Я использую новый маршрутизатор 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


person Lior    schedule 18.03.2013    source источник
comment
Это лучшее поведение по умолчанию; Маршрутизатор должен быть достаточно хорош, чтобы вам не приходилось поддерживать состояние маршрута на вашей стороне (что-то, в чем маршрутизатор Angular по умолчанию ужасен)   -  person AlexG    schedule 06.05.2013


Ответы (1)


Обычно я решаю проблемы такого рода с помощью абстрактных состояний и вложенности. Поместите части, которые не изменяются на основе параметра url, в абстрактное родительское состояние, и вы избежите дополнительного обращения к серверу. Я предпочитаю размещать их в разделе разрешения или пользовательских данных в родительском состоянии, но при необходимости вы можете получить их через наследование области. Убедитесь, что вы прочитали и поняли правила наследования области действия, поскольку есть некоторые вещи, которые (по крайней мере, для меня) были неожиданными.

Вы можете прочитать более подробную информацию здесь: https://github.com/angular-ui/ui-router/wiki/Nested-States-%26-Nested-Views. Кроме того, пример приложения, включенный в angular-ui, является хорошим местом для начала понимания вложенности состояний.

person brocksamson    schedule 16.10.2013