为什么只有在另一个视图中才执行控制器逻辑?
http://jsfiddle.net/J5hRc/128/
如果您在链接中按两次,则仅在第一次显示警报。我做错了什么?
HTML:
<script type="text/ng-template" id="page1.html">
Page 1
</script>
<script type="text/ng-template" id="page2.html">
Page 2
</script>
<div>
<ul>
<li><a href="#/link1">Page 1</a></li>
<li><a href="#/link2">Page 2</a></li>
</ul>
<div ng-view></div>
</div>
使用Javascript:
var myApp = angular.module('myApp', []);
myApp.controller('MyCtrl1', function($scope) {
alert('controller logic1'); });
myApp.controller('MyCtrl2', function($scope) {
alert('controller logic2'); });
myApp.config(function($routeProvider) {
$routeProvider
.when('/link1', {
controller: 'MyCtrl1',
templateUrl: 'page1.html'
})
.when('/link2', {
controller: 'MyCtrl2',
templateUrl: 'page2.html'
});
});
答案 0 :(得分:1)
没有。你没有做错任何事。这是网络中的默认行为,您的浏览器会确保它不会导航到您已经使用过的链接,如果您考虑它就会有常识。如果您手动导航到该路线并调用$route.reload()
(而不是使用hrefs),则可以重新加载路线。例如:
$scope.goToRoute= function(url){
$location.path(url);
$route.reload();
}
答案 1 :(得分:1)
您的警报位于控制器的构造函数中。因此,它们显然只会在创建控制器时触发。
示例中的控制器是在路由更改时创建的,因此当您更改为新路由时,您会看到它们触发警报。一旦你进入一条路线,控制器就不会再被实例化,除非你离开并回来。
如果您希望每次单击链接时以及首次导航到视图时触发此逻辑,则连接clickHandler并在控制器的构造函数中调用clickHandler:
myApp.controller('MyCtrl1', function($scope) {
$scope.showAlert = function () {
alert('controller logic1');
}
$scope.showAlert();
});
在你看来:
<li><a ng-click="showAlert()" href="#/link1">Page 1</a></li>
答案 2 :(得分:0)
因为如果您位于带有$ location path /link1
的page1上,然后点击链接/link1
,当然路径不会再次改变,因此路线也不会改变。并且因为$routeChangeSuccess
事件永远不会发生,而ngView
指令正在监听它。这个ngView
指令内部事件监听器负责控制器实例化,当然也不会发生。