我的应用程序在选项卡之间切换时使用$state.go
,这会导致重新初始化控制器,并且这些控制器中的范围变量会更新并导致内存泄漏。有没有办法停止重新初始化控制器,但更改状态更改时的URL?
以下示例是我的应用程序中的routes.js。
.state('home',
{
abstract : true,
url : '/home',
templateUrl : 'scripts/home.html'
})
.state('home.summary',
{
url : '/summary?userId',
controller : 'SummaryCtrl',
views :
{
summary:
{
templateUrl: 'scripts/home/summary.html'
}
}
})
.state('home.summary.detail',
{
url : '/detail/:id',
controller : 'DetailCtrl',
views :
{
detail:
{
templateUrl: 'scripts/home/detail.html'
}
}
})
如果已经为唯一ID加载了DetailCtrl,如何停止重新加载DetailCtrl但是在转到状态home.summary.detail时更改URL
还尝试使用$ q.reject来解决子状态,它会停止重新加载控制器,但不会更改URL。
还尝试了reloadOnSearch = false,它会停止重新加载控制器,但不会更改网址。
答案 0 :(得分:4)
您可以使用 $state.transitionTo
代替 $state.go
。 $state.go
在内部调用 $state.transitionTo
,但会自动将选项设置为 { location: true, inherit: true, relative: $state.$current, notify: true }
。您可以致电 $state.transitionTo
并设置 location: false
。例如:
$state.go('.detail', {id: newId})
可以替换为
$state.transitionTo ('.detail', {id: newId}, { location: false, inherit: true, relative: $state.$current, notify: true })
答案 1 :(得分:0)
您可以拥有一个包含内存泄漏代码的抽象控制器。 当URL更改时,抽象控制器不会更新。
以下是官方github repo的文件
https://github.com/angular-ui/ui-router/wiki/Nested-States-%26-Nested-Views
查看组合部分。
这里是plnkr,联系人控制器只会在这个演示中调用一次 contacts.detail控制器将在每次更改状态时更新,但与联系人控制器共享范围 http://plnkr.co/edit/gmtcE2?p=preview