UI-Router-изменение $state без перезапуска / перезагрузки страницы
Я смотрел на эти страницы (1, 2, 3). Я в основном хочу изменить свой $state
, но я не хочу, чтобы страница перезагрузилась.
Я в настоящее время на странице /schedules/2/4/2014
, и я хочу перейти в режим редактирования, когда я нажимаю кнопку и URL-адрес становится /schedules/2/4/2014/edit
.
мой edit
государство просто $scope.isEdit = true
, поэтому нет смысла перезагружать всю страницу. Тем не менее, я хочу $state
и/или url
изменить таким образом что если пользователь refreshses страницы, он начинается в режиме редактирования.
что я могу сделать?
2 ответов
для этой проблемы вы можете просто создать дочернее состояние, которое не имеет ни templateUrl
, ни controller
и вперед между states
обычно:
// UPDATED
$stateProvider
.state('schedules', {
url: "/schedules/:day/:month/:year",
templateUrl: 'schedules.html',
abstract: true, // make this abstract
controller: function($scope, $state, $stateParams) {
$scope.schedDate = moment($stateParams.year + '-' +
$stateParams.month + '-' +
$stateParams.day);
$scope.isEdit = false;
$scope.gotoEdit = function() {
$scope.isEdit = true;
$state.go('schedules.edit');
};
$scope.gotoView = function() {
$scope.isEdit = false;
$state.go('schedules.view');
};
},
resolve: {...}
})
.state('schedules.view', { // added view mode
url: "/view"
})
.state('schedules.edit', { // both children share controller above
url: "/edit"
});
важным концепция вот, что в ui-router
, когда приложение находится в определенном состоянии-когда состояние "активно"-все его предковые состояния также неявно активны.
Итак, в данном случае,
- когда приложение переходит из режима просмотра в режим редактирования, его родительское государство
schedules
(вместе сtemplateUrl
,controller
и дажеresolve
) сохранятся. - поскольку состояния предков неявно активируются, даже если дочернее состояние обновляется (или загружается непосредственно из закладки), страница будет отображаться правильно.
REF: https://github.com/angular-ui/ui-router/wiki/Quick-Reference#statetransitiontoto-toparams--options
$state.transitionTo('yourState', params, {notify: false});