Mam dwa kontrolery, jeden w drugim. Teraz wiem, że zakres podrzędny dziedziczy właściwości z zakresu nadrzędnego, ale czy istnieje sposób na zaktualizowanie zmiennej zakresu nadrzędnego? Jak dotąd nie znalazłem żadnych oczywistych rozwiązań.
W mojej sytuacji mam kontrolera kalendarza w formularzu. Chciałbym zaktualizować daty rozpoczęcia i zakończenia z zakresu nadrzędnego (którym jest formularz), aby formularz miał daty rozpoczęcia i zakończenia w momencie przesłania.
Odpowiedzi:
Musisz użyć obiektu (nie prymitywu) w zakresie nadrzędnym, a wtedy będziesz mógł go zaktualizować bezpośrednio z zakresu podrzędnego
Rodzic:
Dziecko:
Działające demo : http://jsfiddle.net/sh0ber/xxNxj/
Zobacz Jakie są niuanse dziedziczenia prototypowego / prototypowego zakresu w AngularJS?
źródło
Jest jeszcze jeden sposób, aby wykonać to zadanie i nie używać
$scope.$parent
zmiennej.Po prostu przygotuj metodę zmiany wartości w zakresie nadrzędnym i użyj jej w zakresie podrzędnym. Lubię to:
Działa również i zapewnia większą kontrolę nad zmianami wartości.
Następnie można również wywołać metodę nawet w HTML, takich jak:
<a ng-click="changeSimpleValue('y')" href="#">click me!</a>
.źródło
To również działa (ale nie jestem pewien, czy jest to zgodne z najlepszą praktyką, czy nie)
źródło
Kiedy przypisujesz prymitywny atrybut do zakresu, zawsze tak jest lokalny dla zakresu (prawdopodobnie tworzony w locie), nawet jeśli zasięg nadrzędny ma atrybut o tej samej nazwie. To jest decyzja projektowa i dobra decyzja IMHO.
Jeśli chcesz zmienić jakieś prymitywy (ints, booleans, strings) w zakresie nadrzędnym, z widoku potrzebujesz, aby był to atrybut innego obiektu w tym zakresie, więc przypisanie może brzmieć:
i to z kolei:
viewData
obiekt z dowolnego zakresu, w którym jest zdefiniowanymyAttr
atrybutu.źródło
Aby uzyskać dostęp do zmiennych zadeklarowanych w rodzicu, powinniśmy użyć $ parent w kontrolerze podrzędnym lub pliku szablonu
W kontrolerze
W szablonie html
źródło