防止在$ location.path()上重新初始化控制器

时间:2013-09-19 16:42:25

标签: angularjs angularjs-routing

我正在开发一个应用程序,我必须从详细信息页面向主页面插入后导航链接。两种视图的控制器都不同。我正在使用$location.path('/')导航回主页面。问题是,当我通过点击此链接向后导航时,我的主页面控制器被重新初始化,这不是预期的行为。有没有办法防止在路由回同一链路时重新初始化控制器。

2 个答案:

答案 0 :(得分:5)

我假设您正在使用AngularJS内置路由模块。如果有问题的控制器与路线相关联,那么只要路线与新位置匹配,它就会被初始化。你无法避免它。如果您不希望多次创建控制器,则应在视图层次结构中将其定义为高位。例如,主页的结构可能是这样的。

<html>
...
<body>
  <div ng-controller="SharedController">
    ...
    <ng-view></ng-view>
    ...
  </div>
</body>
</html>

此处,SharedController只会被实例化一次,无论用户导航到哪个位置。您可以将ng-view移到div所占用的SharedController之外,但这会阻止范围继承工作,即ng-view内的范围不会原型地从注入SharedController的范围继承{1}}。

另一种选择是使用第三方库ui-router,它引入了嵌套状态的概念。有了它,你可以用一个控制器构建一个父状态,当用户访问不同的子状态时,该控制器只被实例化一次。

答案 1 :(得分:0)

由于我的角度项目中有多个应用程序,因此我很难实现上面发布的答案,因为我的层次结构中的ng-view决定了向用户显示哪个应用程序。因此,解决方案是将数据存储在服务中。在应用程序中导航时,服务不会重新实例化,因此数据保持不变。

内部控制器,

// Check if data is present in service

if (service.dataModel && service.dataModel.data) {
    // insert data in scope variables here
} 

else {
   // fetch data from server and add data model to service.
}