角度ui-router所有控制器都重新加载状态变化

时间:2014-10-02 19:23:58

标签: javascript angularjs angular-ui-router

我遇到了角度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丢失以导航到一个状态。

enter image description here

1 个答案:

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