2013-02-27 13 views
9

w moim rootscope Mam właściwość visible który kontroluje widoczność div

app.run(function ($rootScope) { 
    $rootScope.visible = false; 
}); 

Przykład HTML:

<section ng-controller='oneCtrl'> 
    <button ng-click='toggle()'>toggle</button> 
    <div ng-show='visible'> 
     <button ng-click='toggle()'>&times;</button> 
    </div> 
</section> 

Kontroler:

var oneCtrl = function($scope){ 
    $scope.toggle = function() { 
     $scope.visible = !$scope.visible; 
    }; 
} 

Powyższa sekcja działa poprawnie, element jest wyświetlany lub ukrywany bez problemów. Teraz na tej samej stronie w innej sekcji próbuję zmienić zmienną visible, aby pokazać div, ale to nie działa.

<section ng-controller='otherCtrl'> 
    <button ng-click='showDiv()'>show</button> 
</section> 

Kontroler:

var otherCtrl = function($scope){ 
    $scope.showDiv = function() { 
     $scope.visible = true; 
    }; 
} 
+0

Czy masz JSFiddle tego możemy zobaczyć? –

+1

Mój rzeczywisty kod jest większy, tutaj jest tylko wersja szybka i krótka. – olanod

Odpowiedz

22

W angularjs, $scope s prototypowo dziedziczą z ich zakresu nadrzędnego, aż do $rootScope. W JavaScript typy pierwotne są nadpisywane , gdy dziecko je zmienia. Dlatego ustawiając $scope.visible w jednym ze swoich kontrolerów, właściwość $rootScope nigdy nie została dotknięta, ale nowa właściwość visible została dodana do bieżącego zakresu.

W AngularJS wartości modelu w zakresie powinny zawsze mieć kropkę, czyli być obiektami zamiast elementów podstawowych.

Jednak można również rozwiązać sprawę poprzez wstrzyknięcie $rootScope:

var otherCtrl = function($scope, $rootScope){ 
    $scope.showDiv = function() { 
    $rootScope.visible = true; 
    }; 
} 
+0

Nie chciałem wstrzykiwać $ rootscope w kontrolerze, ale działa. – olanod

+0

Zachowanie wartości w '$ rootScope' nie jest prawdopodobnie najlepszym rozwiązaniem. Będzie to działać w tym przypadku, jak powiedziałem, ale może nie być najlepszym podejściem. Jednak bez dodatkowych informacji trudno jest powiedzieć, jakie byłoby najlepsze rozwiązanie. –

1

Jak jesteś zaznajomiony z pojęciem $ zakresu? Wydaje mi się, że na podstawie Twojego kodu utrzymujesz dwie osobne zmienne $ scope o nazwie "widoczne" w dwóch różnych zakresach. Czy każdy ze swoich kontrolerów ma swoje własne zakresy? Często tak się dzieje, w którym to przypadku edytujesz różne zmienne o nazwie "visible", gdy wykonasz $ scope.visible = true w różnych kontrolerach.

Jeśli widoczny jest naprawdę w rootcope, można zrobić $ rootScope.visible zamiast $ scope.visible, ale jest to trochę nieporządne.

Jedną opcją jest posiadanie tej sekcji kodu "otherCtrl" w dyrektywie (prawdopodobnie powinieneś to robić mimo to), a następnie dwukierunkowe powiązanie zakresu dyrektywy z zakresem rodzica, który można read up on here. W ten sposób zarówno dyrektywa, jak i kontroler stron używają tego samego obiektu zasięgu.

Aby lepiej odfiltrować swój zakres $, wypróbuj wtyczkę Chrome dla Angular, o nazwie Batarang. Pozwólmy ci przetrawdzić WSZYSTKIE twoje lunety i zobacz model przeznaczony dla ciebie, zamiast tylko mieć nadzieję, że szukasz odpowiedniego miejsca.

+0

Dzięki, pomyślałem, że $ rootScope.visible zostało już zainicjalizowane $ scope.visible byłoby odniesieniem do niego – olanod

+0

Nie! Każdy kontroler powinien mieć osobny zakres $.$ rootScope jest dostępny, ale nie jest związany tak, jak opisujesz. Z wyjątkiem sytuacji, gdy dostajesz się do dyrektyw - możesz powiązać ze sobą zmienne zakresu nadrzędnego/podrzędnego w sposób, w jaki chcesz z nich korzystać. Mimo to nadal zalecałbym używanie $ rootScope bezpośrednio. –

+1

W rzeczywistości zakresy kontrolerów dziedziczą tak samo jak zakresy dyrektyw, aż do '$ rootScope'. * Są * ograniczone, tak jak oczekuje @olanod; Problem polega na tym, że w JavaScript typy pierwotne są nadpisywane w dzieciach podczas korzystania z prototypowego dziedziczenia, co robi '$ scope'. Ale w tym przypadku zalecam także używanie '$ rootScope' - usługi są prawdopodobnie lepszym wyborem. –

Powiązane problemy