2014-10-05 4 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 Таким образом, после моего URL был изменен на /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

+1

@pherris Да, да, именно поэтому я сказал, что OP должен использовать что-то еще в финальном коде - я сделал это с помощью корнеплодов, потому что это был самый быстрый способ показать ему, что происходит в коде. – Shomz

+1

@Shomz Спасибо! –