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

Javascript 停止AngularJs创建新的控制器/$scope缓存并使用缓存的缓存,javascript,angularjs,Javascript,Angularjs,每次用户单击链接时使用$routeProvider,就会生成一个新的$scope。这意味着所有的数据都丢失了。如何使用相同的控制器/$scope 说明: (点击链接) $routeProvider。 当(“/”,{template:“{{$id}}”,控制器:ContentListCtrl})。 当('/view',{template:“{{$id}}”,控制器:ContentDetailCtrl})。 另外,是否有可能知道哪个控制器当前处于活动状态?在AngularJS中,$scope并

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

说明:

(点击链接)


$routeProvider。
当(“/”,{template:“{{$id}}”,控制器:ContentListCtrl})。
当('/view',{template:“{{$id}}”,控制器:ContentDetailCtrl})。

另外,是否有可能知道哪个控制器当前处于活动状态?

在AngularJS中,
$scope
并不用于保存应用程序中持续存在的数据。为此,您希望使用注入两个控制器的服务。如果你能提供更多关于你在不同路线上丢失了哪些数据的细节,我很乐意修改这个答案,让它包含一些更具可操作性的内容


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

对于那些研究如何在AngularJS中“解除绑定”的人,他提供了一些信息(与上面OP的最后一条评论相关)

当一个视图被破坏时,它基本上被标记为垃圾收集,但它仍然存在。这就是为什么当滚动发生时,您会收到多个请求——因为它仍在侦听事件

因此,处理这个问题的最简单方法(我已经找到了,不过我想学习其他方法)是倾听$destroy事件并对其作出反应

通过保留对$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();
});
现在,那些旧的作用域/视图将不再对事件作出反应


希望这对别人有帮助

这个答案是正确的。如果您有特定的数据要缓存,也可以使用Angular的$cacheFactory,但当您更改路由时,$scope会被销毁,这是绝对正确的。如果您不想销毁$scope,并且使用服务不适合您的应用程序,请不要使用路由和使用包含。我为无限滚动实现了此示例,但当我更改路由时,loadMore仍然处于绑定状态,因此,如果我触发控制器10次,我将有10个loadMore实例在侦听,并且在每个滚动时将有10个请求。所以我希望如果我能坚持使用控制器,就不会收到不必要的请求。有什么解决办法吗?@n0mercy我不知道为什么你会有这么多听众,甚至不止一个。你能给它添加一些路由并使用一些
console.log()
语句来说明你的意思吗?这就是我所说的:我想问题是我在这里使用的是window.bind。我说得对吗?这是一个总是有一个监听器的版本,但我需要绑定到window scroll::实际上,这个问题有点超出范围。我将以这个具体问题为主线。如何绑定/解除绑定到角度视图中的“窗口”。因为我什么都找不到。非常感谢!
$scope.systemListener = $rootScope.$on("someEventYouListenTo", function (event, data) {
  console.log('Event received by ' + $scope.name);
});

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