Jeśli mam następujące kontrolery:
function parent($scope, service) {
$scope.a = 'foo';
$scope.save = function() {
service.save({
a: $scope.a,
b: $scope.b
});
}
}
function child($scope) {
$scope.b = 'bar';
}
Jaki jest właściwy sposób aby parent
zapoznać b
się z child
? Jeśli konieczne jest zdefiniowanie b
w parent
, czy nie oznacza to, że byłoby to semantycznie niepoprawne, zakładając, że b
jest to właściwość, która opisuje coś związanego, child
a nie parent
?
Aktualizacja: Dalsze myślenie o tym, gdyby miało b
to więcej niż jedno dziecko , spowodowałoby konflikt, parent
na którym można b
by odzyskać. Moi pozostaje pytanie, jaki jest właściwy sposób, aby uzyskać dostęp b
z parent
?
Odpowiedzi:
Zakresy w AngularJS używają dziedziczenia prototypowego, podczas wyszukiwania właściwości w zakresie podrzędnym interpreter będzie szukał łańcucha prototypów zaczynając od dziecka i kontynuował do rodziców, aż znajdzie właściwość, a nie na odwrót.
Sprawdź komentarze Vojty w tej sprawie https://groups.google.com/d/msg/angular/LDNz_TQQiNE/ygYrSvdI0A0J
W skrócie: nie można uzyskać dostępu do zakresów podrzędnych z zakresu nadrzędnego.
Twoje rozwiązania:
$emit
wysyła zdarzenia w górę do rodziców aż do zakresu głównego, a$broadcast
zdarzenia w dół. Może to pomóc w utrzymaniu poprawności semantycznej.źródło
localStorage
zależność taka jakngStorage
.Chociaż odpowiedź jm- jest najlepszym sposobem na rozwiązanie tego przypadku, w przyszłości możliwe jest uzyskanie dostępu do zakresów podrzędnych za pomocą elementów członkowskich $$ childHead, $$ childTail, $$ nextSibling i $$ prevSibling zakresu. Nie są one udokumentowane, więc mogą ulec zmianie bez powiadomienia, ale są tam, jeśli naprawdę potrzebujesz przemierzać lunety.
Skrzypce
źródło
Możesz spróbować tego:
następnie w kontrolerze podrzędnym (zakresie) dodaj:
Teraz rodzic ma dostęp do zakresu dziecka.
źródło
Jednym z możliwych obejść jest wstrzyknięcie kontrolera podrzędnego do kontrolera nadrzędnego za pomocą funkcji inicjującej.
Możliwa realizacja:
Gdzie
ChildController
masz:Więc teraz
ParentController
możesz użyć:Ważne:
Aby działać poprawnie, musisz użyć dyrektywy
ng-controller
i zmienić nazwę każdego kontrolera, używającas
tak, jak zrobiłem w html, np.Wskazówki: Podczas procesu
użyj wtyczki ng-inspector chrome . Pomoże ci to zrozumieć drzewo.
źródło
Używanie $ emit i $ broadcast (jak wspomniał walv w komentarzach powyżej)
Aby uruchomić wydarzenie w górę (od dziecka do rodzica)
Aby uruchomić zdarzenie w dół (od rodzica do dziecka)
i wreszcie posłuchać
Więcej informacji: - https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
Cieszyć się :)
źródło
Tak, możemy przypisać zmienne z kontrolera podrzędnego do zmiennych w kontrolerze nadrzędnym. Oto jeden możliwy sposób:
Omówienie: głównym celem poniższego kodu jest przypisanie zmiennej $ scope.variable kontrolera podrzędnego do $ scope.epage kontrolera nadrzędnego
Objaśnienie: Istnieją dwa kontrolery. Zwróć uwagę, że w html kontroler nadrzędny obejmuje kontroler podrzędny. Oznacza to, że kontroler nadrzędny zostanie wykonany przed kontrolerem podrzędnym. Zatem najpierw zostanie zdefiniowana metoda setValue (), a następnie sterowanie przejdzie do kontrolera podrzędnego. Zmienna $ scope.variable zostanie przypisana jako „dziecko”. Następnie ten zakres potomny zostanie przekazany jako argument do funkcji kontrolera nadrzędnego, gdzie $ scope. assign otrzyma wartość „child”
źródło