3

每次用户单击链接时使用 $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}).

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

4

2 回答 2

4

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

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

于 2013-03-05T20:33:55.843 回答
3

对于那些研究如何在 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();
});

现在那些旧的范围/视图将不再对事件做出反应。

希望对某人有所帮助!

于 2014-04-17T16:44:38.980 回答