Подтвердить что ты не робот

Как сделать angular родительское состояние ui-router всегда выполнять код контроллера при изменении состояния?

Скажем, у нас есть родительско-дочерняя связь, определенная в нашем $stateProvider следующим образом:

    .state('myProfile', {
        url: "/my/profile",
        templateUrl: 'my/profile.html',
        controller: 'MyProfileController'
    }).state('myProfile.edit', {
        url: "/edit",
        templateUrl: 'my/profile.edit.html',
        controller: 'EditMyProfileController'
    });

Идея здесь в том, что родительское состояние myProfile не редактируется, но дочернее состояние myProfile.edit - это фактическая форма для редактирования профиля. Пусть игнорируется, работает ли страница профиля - я просто общаюсь с вещами и изучаю.

Когда пользователь отправляет форму, я использую объект $state для возврата на родительскую страницу:

$scope.save = function() {
    userResource.update($scope.user, function() {
        SessionService.refresh();

        $state.go('myProfile'); // also tried with reload: true as well
    });
}

После того, как пользователь сохранит данные профиля - и он будет сохранен правильно - родительский вид не будет обновлен, если я не удалю F5 и не обновить браузер.

Одна вещь, которую я заметил, заключается в том, что если я создаю дочерний элемент myProfile.edit в самом родителе, а не в дочернем состоянии myProfile, эта проблема действительно исчезнет, ​​и все будет вести себя так, как ожидалось (хотя внешний вид макета плохо как это).

Кажется, что UI Router, возможно, кэширует результат родителя, ничего не подозревая, что вещи изменились в модели и что ему нужно перезапустить контроллер?

Как я могу сохранить отношения родитель-ребенок, все еще имея родительскую страницу myProfile, всегда выполняет свой контроллер для перезагрузки своих данных? В принципе, я хочу, чтобы это происходило всякий раз, когда используется $state или когда нажимается ссылка, которая направляется на myProfile. Как я могу это сделать?

И если я не могу делать то, о чем я прошу, тогда я знаю, что могу настроить кучу дочерних состояний и заставить их работать по назначению... однако, как я могу установить дочернее состояние по умолчанию для родителя? Например, допустим, что я хочу, чтобы myProfile.edit было дочерним состоянием по умолчанию myProfile - как я могу это сделать?

Спасибо!

4b9b3361

Ответ 1

Чтобы заставить родительское состояние перезагружаться при переходе к нему из дочернего состояния, вы можете использовать оба способа ниже. Чистый js или атрибут директивы.

<a ui-sref="myProfile" ui-sref-opts="{ reload: true }">Back to My Profile</a>

или

$state.go('myProfile', null, { reload: true });

Ответ 2

Пробовали ли вы прослушивание события $stateChangeStart и/или используя $state.reload()?

Ответ 3

Похоже, есть ошибка в $state.go, которая не учитывает параметры перезагрузки. $state.transitionTo работает для меня.

$state.transitionTo('state',null,{reload: true});