Javascript Angular 1 ui router 1.0.24:在不重新加载控制器的情况下以编程方式更改url,保留历史记录并手动更改url
我想保持页面url与使用ui router 1.0.24的angular 1页面的内部状态同步 更改页面筛选器时,将重新加载页面数据,然后调用$state.transitiono()将url与新筛选器同步:Javascript Angular 1 ui router 1.0.24:在不重新加载控制器的情况下以编程方式更改url,保留历史记录并手动更改url,javascript,angularjs,url,dynamic,angular-ui-router,Javascript,Angularjs,Url,Dynamic,Angular Ui Router,我想保持页面url与使用ui router 1.0.24的angular 1页面的内部状态同步 更改页面筛选器时,将重新加载页面数据,然后调用$state.transitiono()将url与新筛选器同步: $state.transitionTo($state.current.name, self.getPageParams(), { /*location: 'replace',*/ reload: false, inherit: false, notify: false, custom: {u
$state.transitionTo($state.current.name, self.getPageParams(), { /*location: 'replace',*/ reload: false, inherit: false, notify: false, custom: {urlChangedAfterReload: true} });
页面状态定义为:
$stateProvider
.state('page', {
url: '/Page/:dateParam/:modeParam',
params: {
dateParam: {value: null, dynamic: false},
modeParam: {value: 'READ', dynamic: false}
},
...
})
我尝试将参数标记为动态(使用dynamic:true):选项可以避免控制器重新加载,但同时不允许手动更改url,也不允许使用历史记录(参数是动态的,因此ui路由器忽略它们的更改)
只有当我以编程方式更改url时,才可以启用动态选项,当用户手动、通过历史记录或通过链接更改url时,将其禁用?我找到了一个解决方案
在更改url之前,我将当前页面的所有参数设置为动态(这样控制器就不会重新加载)
然后,当转换完成时,我将动态参数设置为false(因此,如果用户将更改url或使用浏览器历史记录,页面将重新加载)。
参数更改时调用onSuccess,否则调用onSuccess
this.$onInit = function () {
...
const uiRouterOnSuccess = $transitions.onSuccess({}, () => {
$log.info('onSuccess');
const pageParams = $stateRegistry.states[$state.current.name].params;
Object.keys(pageParams).forEach(paramName => pageParams[paramName].dynamic = false);
return true;
});
const uiRouterOnError = $transitions.onError({}, () => {
$log.info('onError');
const pageParams = $stateRegistry.states[$state.current.name].params;
Object.keys(pageParams).forEach(paramName => pageParams[paramName].dynamic = false);
return true;
});
$log.info('$onInit');
$scope.$on('$destroy', () => {
$log.info('$destroy');
uiRouterOnSuccess();
uiRouterOnError();
});
};
getPageParams使用过滤器值更新参数
this.getPageParams = function() {
const params = $state.current.params;
params.dateParam = xxx;
params.modeParam = yyy;
return params;
};
this.getPageParams = function() {
const params = $state.current.params;
params.dateParam = xxx;
params.modeParam = yyy;
return params;
};