控制器逻辑仅在您处于另一个视图中时才会执行

时间:2014-11-24 15:46:16

标签: javascript html angularjs

为什么只有在另一个视图中才执行控制器逻辑?

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'
 });

});

3 个答案:

答案 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指令内部事件监听器负责控制器实例化,当然也不会发生。