阻止AngularJs创建新的控制器/ $ scope缓存并使用缓存的缓存

时间:2013-03-05 20:20:16

标签: javascript angularjs

每次用户点击链接时使用$ routeProvider,都会生成一个新的$ scope。这意味着所有数据都将丢失。如何让Angular使用相同的控制器/ $ scope?

说明:

http://jsfiddle.net/mpKBh/1/ (点击链接)

<a href='#'>First controller</a>
<a href='#/view'>Second controller</a>

$routeProvider.
  when('/', { template:"{{$id}}",controller: ContentListCtrl}).
  when('/view', {template:"{{$id}}",controller: ContentDetailCtrl}).

P.S。是否可以知道哪个控制器当前处于活动状态?

2 个答案:

答案 0 :(得分:4)

在AngularJS中,$scope not 意味着保存在您的应用程序中持续存在的数据。为此,您希望使用注入两个控制器的服务。如果您提供有关您在路线中缺少哪些数据的更多详细信息,我很乐意修改此答案,以包含更具可操作性的内容。

在您的PS中:您可以注入$route服务以获取有关当前路线的信息; $route.current.controller属性将为您提供当前路由的构造函数。

答案 1 :(得分:3)

对于那些研究如何解开&#34;解开&#34;在AngularJS中,他有点信息(与OP上面的最后评论有关)

当视图被销毁时,它基本上标记为用于垃圾收集 - 但它仍然存在。这就是为什么当滚动发生时你得到多个请求 - 因为它仍在监听事件。

所以解决这个问题的最简单方法(我已经发现,虽然我想了解其他方法)是听取$ destroy事件并对其作出反应。

你可以&#34;解开/解开&#34;对于事件,通过保持对$ on方法返回的内容的引用。以下是从控制器中获取的示例:

$scope.systemListener = $rootScope.$on("someEventYouListenTo", function (event, data) {
  console.log('Event received by ' + $scope.name);
});

$scope.$on('$destroy', function () {
    // Remove the listener
    $scope.systemListener();
});

现在那些旧的范围/观点不再对事件作出反应。

希望能帮助别人!