"ui-sref" не обновляет "ui-view" (его контроллер не перезапускается) при двойном щелчке ссылки
Когда сначала щелкнет состояние, div, которому принадлежит атрибут "ui-view", заменяется "шаблоном" этого состояния. Однако, когда я снова нажимаю одно и то же состояние, его контроллер не перезагружается. Как я могу снова загрузить этот контроллер?
Например, предположим, что у меня есть следующее меню навигации:
<nav>
<a ui-sref="state1">State 1</a>
<a ui-sref="state2">State 2</a>
</nav>
Мой контент "ui-view" выглядит следующим образом:
<div ui-view></div>
Мои состояния описаны ниже. Когда я нажимаю "State1" в меню навигации, я ожидаю увидеть текст "Ctrl 1 loaded"
на developer console
. Если это первый раз, я наблюдаю этот текст. Однако, когда я повторно нажимаю одну и ту же ссылку, контроллер не загружается снова, то есть я не мог дважды увидеть текст "Ctrl 1 loaded"
, отображаемый на консоли.
myApp.config(function ($stateProvider, $urlRouterProvider){
$stateProvider.state("state1", {
url: "#",
template: "<p>State 1</p>",
controller: "Ctrl1"
}).state("state2", {
url: "#",
template: "<p>State 2</p>",
controller: "Ctrl2"
});
});
Почему? У вас есть идеи?
Вот JSFiddle этого вопроса.
Ответы
Ответ 1
Как сказал Филипп, это потому, что это поведение по умолчанию для ui-router, но если вы хотите перезагрузить контроллер каждый раз, когда вы нажимаете на свою ссылку, вы можете использовать ui-sref-opts, чтобы заставить его, например:
<a ui-sref="state1" ui-sref-opts="{reload: true}">State 1</a>
Нашел этот совет здесь:
https://github.com/angular-ui/ui-router/commit/91a568454cc600aa4f34dedc8a80c9be1130b1c5
Надеюсь, что это поможет
Ответ 2
Альтернативный синтаксис для перехода к другому представлению будет
<a ui-sref="state1({reload: true})">State 1</a>
На контроллере это будет выглядеть так.
$state.go('state1', {}, {reload: true});
Примечание. Второй параметр $state.go - $stateParams.
Ответ 3
В связи с тем, как разработан ui-router.
Контроллер загружается только тогда, когда он не находится в том же состоянии. ui-router не перезапустит контроллер и не переоценит шаблон представления.
Даже когда вы используете один и тот же контроллер на нескольких состояниях и переключаетесь между ними, контроллер не будет перезагружен.
Если вы хотите запускать функциональные возможности при изменении вида, вы можете прослушать события или даже поставить ng-click
на свой a
.
Ответ 4
просто используйте ниже код
$stateProvider.
state('myPage', {
url: '/',
cache: false // add this line