Ui-router - текущее состояние перезагрузки
Мне интересно, как "перезагрузить" текущее состояние, передав новый параметр, чтобы мой контроллер снова инициализировался.
Я пытаюсь выполнить поиск в моем боковом элементе управления - и в исходном поиске используется $state.go для перехода к моему новому состоянию следующим образом:
if ($event.type === 'click' || $event.keyCode === keyCodes.enter) {
$state.go("people.search", { search: vm.searchText });
Если я нахожусь в другом состоянии приложения, и приведенный выше код работает, все работает правильно. Итак, я перехожу в поисковый запрос как параметр, а $state.go переводит мое состояние в состояние people.search, а мой контроллер людей (содержащий функцию поиска) получает удар. Но как только я нахожусь в состоянии people.search и пытаюсь использовать элемент управления поиска, код контроллера пользователя больше не попадает и параметры не обновляются.
Я пробовал модифицировать код:
$state.go("people.search", { search: vm.searchText }, { location: "replace" });
Теперь, когда я нахожусь в текущем состоянии, это обновит URL с моим новым поисковым термином, но код контроллера не срабатывает.
Мне нужен способ принудительно перезагрузить то же самое состояние, в котором я сейчас включен, чтобы новый параметр поиска обновлялся, а код контроллера пользователя снова запускался.
Как перезагрузить текущее состояние?
Ответы
Ответ 1
Внутри javascript Вы можете вызывать текущее состояние следующим образом:
$state.go ('.', { search: vm.searchText } )
Начиная с версии 1.2.5 вы также можете просто перезагрузить состояние:
$state.reload()
Это все хорошо, но я предпочитаю способ перезагрузить состояние с разными параметрами в директиве.
Поэтому я заглянул в исходный код ui-router, чтобы понять, что директива uiSref игнорируется, когда состояние остается неизменным. Хотя хорошо предотвратить перезагрузку, если ничего не изменилось, изменение параметров внутри состояния может быть полезно в некоторых случаях.
Итак, я создал свою собственную директиву uiSrefParams:
https://gist.github.com/IlanFrumer/8281567
Пример
<span>Change language:</span>
<a ui-sref-params="{lang: 'en'}">english</a>
<a ui-sref-params="{lang: 'ru'}">russian</a>
Надеюсь, что это поможет.
Ответ 2
попробуйте это
$state.go($state.current, {}, {reload: true});
Ответ 3
Заметьте, что 0.2.14 у вас также есть возможность просто перезагрузить текущее состояние, а не родительское.
Итак, $state.go(people.search, {}, {reload: true});
перезагрузит состояние people
, а также все его дочерние элементы.
Пока $state.go(people.search, {}, {reload: "people.search"});
не перезагружает состояние people
, но перезагрузит people.search
и его дочерние элементы.
Ответ 4
Также обратите внимание, что ваше состояние должно иметь ?param
в конце, чтобы это решение работало. Я попался на это, потому что $location.search()
работает без него.
Ответ 5
Я думаю, что это был бы лучший подход
<a data-ui-sref="directory.organisations.details" data-ui-sref-opts="{reload: true}">Details State</a>
Мы можем перезагрузить состояние только из HTML.