我遇到了角度ui-router的问题,其中当进入相同状态(但具有不同的参数)时,给定状态下的所有控制器都被刷新。作为参考,我的状态如下:
主要州
{
'app': {
abstract: true,
controller: 'AppCtrl',
template: '<div ui-view></div>',
},
'app.clients': {
url: '/clients/:id',
views: {
'': {
templateUrl: 'stage.html', //has named list and detail views
controller: 'ClientsCtrl'
},
'list@app.clients': {
templateUrl: 'client-list.html',
controller: 'ClientListCtrl'
},
'detail@app.clients': {
templateUrl: 'client-profile.html',
controller: 'ClientProfileCtrl'
}
}
}
}
所以最初这一切似乎都运作良好。 client-list.html
看起来像:
客户list.html
<ul>
<li data-ng-repeat='client in clients'>
<a ui-sref='pencilem.clients({id: client.id})'>{{client.fullName}}</a>
</li>
</ul>
因此,所需的行为是,当客户端列表中单击客户端时,将呈现其配置文件,更新URL(使用新的客户端ID),但我不想重新初始化所有不需要更新的控制器。这会导致滚动视图出现问题(重新渲染到视图的顶部),如果在这些控制器中发生了减慢操作的操作,则会产生高成本。下面的图片突出显示了问题,一旦点击客户端,该视图(粉红色,ClientListCtrl)再次调用它的控制器,并触发重新渲染,滚动到该div的顶部)< / p>
有没有办法使用多个视图/控制器来避免这种情况?我可以传递一个&#34; activeClient&#34;服务中的对象应该向各种控制器发挥作用,但随后我将可管理的URL丢失以导航到一个状态。
答案 0 :(得分:1)
将您不想更新的内容放到抽象的父状态,大致如下:
{
'app': {
abstract: true,
controller: 'AppCtrl',
template: '<div ui-view></div>',
},
'app.clients': {
url: '/clients',
abstract: true,
views: {
'': {
templateUrl: 'stage.html', //has named list and detail views
controller: 'ClientsCtrl'
},
'list@app.clients': {
templateUrl: 'client-list.html',
controller: 'ClientListCtrl'
}
}
},
'app.clients.detail': {
url: '/:id',
views: {
'detail@app.clients': {
templateUrl: 'client-profile.html',
controller: 'ClientProfileCtrl'
}
}
}
}