2014-11-24 71 views
1

爲什麼只有在另一視圖中才能執行控制器邏輯?只有在另一視圖中才會執行控制器邏輯

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

});

回答

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> 
0

因爲如果你在頁面1上用$位置路徑/link1,然後你點擊鏈接/link1位置路徑當然不會再改變,因此路由也不會改變。並且因爲$routeChangeSuccess事件從未發生,因此ngView指令正在監聽。這個ngView指令內部事件監聽器負責控制器實例化,當然這不會發生。

1

不,你沒有做錯任何事。這是網絡中的默認行爲,並且您的瀏覽器可以確保它不會導航到您已有的鏈接,如果您仔細考慮它,這是常識。如果您手動導航到路線並且致電$route.reload()(而不是使用hrefs),則可以重新加載路線。例如:

$scope.goToRoute= function(url){ 
    $location.path(url); 
    $route.reload(); 
} 
+0

但如果我這樣做的路線重新加載邏輯觸發了兩次http://jsfiddle.net/J5hRc/130/ – nerlijma 2014-11-24 16:25:52

+0

解決了您的建議,增加了檢查,如果你是在同頁。 http://jsfiddle.net/J5hRc/131/,謝謝 – nerlijma 2014-11-24 17:02:20

相關問題