Angular Ui Router:停止$ state.go重新加载控制器但更改URL

时间:2014-04-30 01:17:04

标签: angularjs angular-ui-router

我的应用程序在选项卡之间切换时使用$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,它会停止重新加载控制器,但不会更改网址。

2 个答案:

答案 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