Javascript Angular 1 ui router 1.0.24:在不重新加载控制器的情况下以编程方式更改url,保留历史记录并手动更改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

我想保持页面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: {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;
};