Ng-view创建多个控制器/范围

ng-view creating multiple controllers/scope

本文关键字:范围 控制器 创建 Ng-view      更新时间:2023-09-26

我不知道如何解决当前的问题。我在一个页面上有5个标签。每个选项卡通过routing和ng-view加载一个新的页面和控制器。我在每个选项卡上都有一个$locationChangeStart,以便在转到下一个选项卡之前完成一些功能。但是,如果用户返回到前一个选项卡,那么我们就会遇到一些问题。在完成他们对选项卡所做的任何事情并切换到另一个选项卡之后,$locationChangeStart函数将被触发多次,似乎从原始选项卡切换到每个选项卡时都会创建一个新的控制器。

:

  • 当前选项卡= A
  • 切换到新选项卡(B)
  • $locationChangeStart按预期触发
  • 切换回选项卡A
  • $locationChangeStart再次触发Tab A(没有预期,因为我不再在那个页面上,但没关系)
  • 切换到新选项卡(C)
  • 2 $locationChangeStart火。一个具有新作用域,另一个在第一次访问选项卡时具有原始作用域。

当从选项卡a切换到a时,这个过程将发生无限次,每次调用的次数增加1。

活塞:工作演示

index . html:

<div ng-controller="visitController">
  <h3>ng-view demo</h3>
  <ul class="nav nav-tabs">
    <li class="active">
      <a href="#/Information">Information</a>
    </li>
    <li><a href="#/Fingerprint">Fingerprint</a></li>
    <li><a href="#/Agenda">Agenda</a></li>
    <li><a href="#/Logistics">Logistics</a></li>
  </ul>
  <div ng-view>
  </div>
</div>

标签1:

<div ng-controller="InformationController">
    This is the information tab.
</div>

标签2:

<div>
    This is the Fingerprint tab.
</div>

main page js:

angular.module('app', []).config(['$routeProvider', '$locationProvider',
function ($routeProvider, $locationProvider) {
  $routeProvider.when('', {
      templateUrl: "Information.html",
      controller: visitController
  }).when('/Information', {
      templateUrl: "Information.html",
      controller: visitController
  }).when('/Fingerprint', {
      templateUrl: "Fingerprint.html",
      controller: visitController
  })
  $routeProvider
    .otherwise('/Information', {
      redirectTo: "Information.html"
    });
  }
]);
function visitController($scope, $http, $window, $route, $rootScope) {
}

表1 JS

function InformationController($scope, $http, $window, $route, $rootScope) {
  $scope.activated = 0;
  $rootScope.$on('$locationChangeStart', function (event) {
      $scope.activated++;
      alert($scope.activated);
  });
}

这是因为您将事件侦听器附加到$rootScope而不是$scope。

每次加载InformationController时,将新的$locationChangeStart事件侦听器附加到$rootScope

当您在选项卡之间切换时,$rootScope不会重新加载,它保持完整,因此您只需每次都添加相同的事件侦听器。在第五次切换到"信息"选项卡后,您已经建立了五个侦听器并正在收听。

不要使用$rootScope,而是使用$scope,当路由改变时,它会被$销毁,因此,它会清除你以前的监听器。