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