Ng-view创建多个控制器/范围
ng-view creating multiple controllers/scope
我不知道如何解决当前的问题。我在一个页面上有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,当路由改变时,它会被$销毁,因此,它会清除你以前的监听器。
相关文章:
- 动态加载angularjs并生成控制器和范围
- AngularJS控制器范围
- FileReader加载不在控制器范围Angular 2内
- 将外部控制器的范围变量设置为角度
- Angular.js$范围和控制器
- 具有范围变量的控制器不工作
- 将范围添加到角度种子默认视图控制器时,测试套件现在失败
- AngularJS:从控制器访问特定的指令范围
- 从html调用angularjs控制器中的一个函数,但未定义范围变量
- Angular ES6控制器范围
- 离子单选按钮-控制器范围无法识别更改
- Angular:控制器范围内的可重用功能
- 角度单元测试:如何在没有范围的情况下测试控制器属性
- 角度嵌入和访问控制器范围
- 将来自多个控制器的 AngularJS 范围对象合并到一个对象中
- AngularJS:如何在指令范围的对象发生变化时更新与控制器作用域相关联的控制器作用域
- 如何从 ng-repeat(ng-repeat)中的指令访问控制器范围
- 如何从父指令/控制器访问指令范围
- 指令angular中的访问范围控制器变量
- 无法使用 VM 绑定到范围.控制器/HTML 中的表示法