当params改变时,如何阻止ui-router重新加载解析

时间:2017-02-07 17:51:57

标签: angularjs angular-ui-router

我有一个基础应用ui路由器状态的应用...

$stateProvider.state('app', {
  navigationTitleKey : 'app',
  abstract: true,
  url: '/?{param}',
  views: obj
});

然后是childgrand-child州......

$stateProvider.state('app.wizardchild', {
  parent: 'app',
  url: '/wizard',
  resolve: {
     wizard: ['wizard',function(wizard) {
      return new wizard();
    }],
  },

 $stateProvider.state('app.wizardgrandchild', {
      parent: 'app.wizardchild'
   }

当我这样做时......

来自$state.go('app.wizardgrandchild')

app.wizardchild

它按预期工作,向导只解析了一次。

但是当我从$state.go('app.wizardgrandchild', {param:'blah'})

app.wizardchild

重新运行解析块意味着grand-child状态下有一个新的向导副本。但我不希望这种情况发生,我希望它是相同的,而不是创建另一个副本。有没有办法关闭这种行为?

2 个答案:

答案 0 :(得分:0)

尝试将wizard注册为服务(非工厂)。由于所有Angular服务都是单例服务,它应该可以解决您的问题。现在,每次使用new创建向导的新实例时 - 如果使用服务,Angular将自动创建一个实例并在每次需要时注入它(每次注入相同的实例时)

答案 1 :(得分:0)

您的param已在app州宣布。状态参数更改时,将使用新参数值重新加载。当一个州重新加载时,它的所有孩子也会重新加载。

如果可以将参数声明移动到孙子状态,那么应解决问题。

或者,您可以将param保留在应用状态和mark it as dynamic上。动态参数不会导致状态重新加载。

$stateProvider.state('app', {
  navigationTitleKey : 'app',
  abstract: true,
  url: '/?{param}',
  params: { param: { dynamic: true } },
  views: obj
});

如果您正在使用ui-router legacy(0.x),there is reloadOnSearch类似,但可能有错误。

$stateProvider.state('app', {
  navigationTitleKey : 'app',
  abstract: true,
  url: '/?{param}',
  reloadOnSearch: false,
  views: obj
});