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
变量并将网址更改为/second
。在我的$routeProvider
中,我指出带有此网址的路线也必须包含loading controller
。触发按钮后它会消失,因为/second
路由器没有模板。我再次按下主视图上的按钮,我的loading controller
再次执行,但n
变量仍为0.为什么n
的值不是1
?
我知道我的解释令人困惑,但我有plunker
答案 0 :(得分:1)
您正在实例化一个具有新范围的新控制器(因此是一个新变量n
)。您需要将迭代数据保持在更持久的状态,例如父作用域,服务,localStorage等(取决于您需要的数据)。
以下是使用$rootScope
的工作示例,您可以看到(您应该在最终代码中使用$ rootScope以外的其他内容):http://plnkr.co/edit/HETROBPwa6VyjX83Eev0?p=preview
我在控制器中添加了一个简单的console.log('scope', $scope);
,因此您可以看到每次更改网址时都会创建一个新范围。