Alternatywą przedstawieniu właściwości obiektu w zakresie dominującej jest użycie $ rodzica, aby uzyskać dostęp prymitywne w zakresie dominującej:
<input ng-model="$parent.testvalue" />
ng obejmują tworzy zakres dzieci. Ten zakres prototypowo dziedziczy po obszarze nadrzędnym Ctrl. Oto jak działają 3 warianty:
- $ parent.testvalue Opaski model do nieruchomości w zakresie dominującej
- testValue sama łączy model do nowego obiektu, który zostanie utworzony w sprawie zakresu dziecięcej. Ta właściwość "cienie/ukrywa" nadrzędną właściwość zakresu o tej samej nazwie.
- foo.testvalue (np. Patrz odpowiedź @ dnc253) również wiąże model z właściwością nadrzędną. Działa to w ten sposób: Javascript nie widzi/nie znajduje "foo" w zakresie podrzędnym, więc szuka go w zakresie nadrzędnym (z powodu prototypowego dziedziczenia) i znajduje go.
Aby zobaczyć, co zakres dziecko wygląda, użyj oryginalnego skrzypce i dodać ten kod do szablonu gdzieś:
<a ng-click="showScope($event)">show scope</a>
I dodać ten kod do swojej Ctrl:
$scope.showScope = function(e) {
console.log(angular.element(e.srcElement).scope());
}
Przed wpisaniem w polu tekstowym kliknij link "pokaż zakres". W konsoli (używam Chrome) możesz rozszerzyć zakres "Dziecko" i zobaczyć, że nie zawiera jeszcze właściwości testwalu (co jest dla mnie zaskakujące, ponieważ nie wiem, w jaki sposób wyświetla ona "wartość początkową" w polu tekstowym).Możesz rozwinąć element $ parent, a zobaczysz tam właściwość testvalue - właściwość o tej nazwie pojawia się w tym momencie tylko w zakresie nadrzędnym.
Teraz wyczyść konsolę, wpisz w polu tekstowym i kliknij ponownie link "pokaż zakres". Zobaczysz, że zakres "Dziecko" ma teraz nową właściwość testvalue. Cieniuje/ukrywa własność nadrzędną. Tak więc rzeczy w zakresie podrzędnym zobacz właściwość testval scope zakresu, a rzeczy w zakresie nadrzędnym zobacz właściwość testvalue zakres nadrzędny.
Aktualizacja: FYI, niedawno napisał obszerny artykuł na temat odbierania/zakres prototypowego dziedziczenia, który wyjaśnia powyższe koncepcje w znacznie bardziej szczegółowo, z dużą ilością zdjęć: What are the nuances of scope prototypal/prototypical inheritance in AngularJS?
Dzięki, że było dokładnie to. Czy jest to "błąd" w kanciastym, czy jest to zamierzone/oczekiwane? – Caleb
Nie nazwałbym tego "błędem". Chodzi tylko o to, jak działają obiekty javascript i prymitywy, kiedy są przekazywane. Jeśli masz zmienną, która jest ustawiona na łańcuch znaków i przekazujesz ją do funkcji, funkcja może zmienić to, czego chce, i nie wpłynie to na wartość oryginalnego var. Jeśli ten var został ustawiony na obiekt, to jest to referencja, która jest przekazywana, a wszelkie zmiany wprowadzone w niej będą miały wpływ na obiekt, do którego odwoływał się oryginalny var. Mam nadzieję, że to ma sens. – dnc253
Tak, to ma sens. Dziękuję Ci! – Caleb