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.