2014-10-05 117 views
0

代碼plunker。 我有兩個控制器。在第一個控制器我有處理按鈕在我看來

$scope.click = function() { 
    $location.url("/some"); 
    console.log("clicked"); 
} 

在處理程序我更改的URL。我還配置了我的$ routeProvider。

var app = angular.module('plunker', []).config(function ($routeProvider) { 
    $routeProvider.when('/some', {template: " counter is {{n}}</br> <button ng-click='click()'>click to load new url but still with \"loading cntl\"</button>", controller: "loading"}) 
    .when("/second",{controller: "loading"}); 
}); 

在這裏,我有相同的控制器兩種不同的路線 - loading控制器 所以後,我的網址改爲/some新的按鈕出現在我的視野。我在loading控制器中有另一個這個按鈕的處理程序。

app.controller("loading", function ($scope,$location) { 
$scope.n= $scope.n || 0; 
console.log("at the begining n is "+ $scope.n); 
$scope.click = function click() { 
$scope.n++; 
console.log("n after++ is " + $scope.n); 
$location.url("/second"); 

}

}); 這裏我增加n變量並將URL更改爲/second。在我的$routeProvider我表明,此URL的路線也必須有loading controller。觸發按鈕後,它會消失,因爲/second路由器沒有模板。我再次按下主視圖上的按鈕,我的loading controller再次執行,但n變量仍爲0.爲什麼n的值不是1? 我知道,我的解釋是混亂的,但我在plunker

回答

1

代碼你實例化有一個新的範圍(因此一個新變量n)一個新的控制器。你需要保持迭代數據更持久,比如父作用域,服務,localStorage等(取決於你需要的數據)。

下面是使用$rootScope,只是讓你可以看到(你應該使用比$ rootScope以外的東西在你的最終代碼)工作的例子:http://plnkr.co/edit/HETROBPwa6VyjX83Eev0?p=preview

我在控制器中添加了一個簡單console.log('scope', $scope);,這樣你就可以看到每次更改url時,都會創建一個新的作用域。

+3

這是一個很好的例子 - 但我會建議看一下服務而不是rootScope。服務是單身人士,併爲您提供易於測試和嘲笑的好處。 – pherris 2014-10-05 14:05:21

+1

@pherris是的,是的,這就是爲什麼我說OP應該在最終代碼中使用別的東西 - 我是用rootcope做的,因爲這是向他展示代碼中發生了什麼的最快方法。 – Shomz 2014-10-05 14:06:24

+1

@Shomz謝謝! – 2014-10-05 14:12:13

相關問題