2013-02-20 4 views
5

Znalazłem ten wątek, w którym OP original fiddle gdzie zakres ng-include d nie zmienia jego zakresu nadrzędnego.AngularJS: modyfikowanie zakresu nadrzędnego w ng-include

Jedną z odpowiedzi sugeruje:

Jest brzydki i nieprzewidywalna, więc polecam Ci owinąć swoje dane w zmiennej obiektu: http://jsfiddle.net/e5rfP/3/

który wydaje się działać. Dlaczego to?

+0

proszę zobaczyć http://stackoverflow.com/questions/14049480/what-are-the-nuances-of-scope-prototypal-prototypical-inheritance -in-angularjs/14049482 # 14049482 –

+0

Doskonała odpowiedź, Mark. – jogloran

Odpowiedz

8

Zmienna obiektowa działa ze względu na sposób działania prototypowego dziedziczenia JavaScript. ngInclude tworzy własny zakres podrzędny. Ten zakres podrzędny prototypowo dziedziczy z zakresu nadrzędnego.

W JavaScript, kiedy piszemy coś takiego $scope.x = 22 w zakresie dziecięcej, to tworzy właściwość x na zakres dziecko dolarów i przypisuje jej wartość 22 - łańcuch prototypów nie jest konsultowany tutaj, więc zakres rodzic $ robi nie widzę, co się stało.

Kiedy piszemy coś w rodzaju $scope.someObj.prop1 = 22 w zakresie podrzędnym, jeśli JavaScript nie znajdzie obiektu someObj na podrzędnym obiekcie $ scope, konsultuje się on z łańcuchem prototypów, a następny łańcuch $ w łańcuchu jest rodzica $ scope. Jeśli someObj istnieje w nadrzędnym $ scope, wówczas macierzysty zakres $ zostanie zmodyfikowany.

Jak wspomniałem w komentarzu, tak następujące pytanie i odpowiedź wyjaśnia to wszystko bardziej szczegółowo (z dużą ilością zdjęć): What are the nuances of scope prototypal/prototypical inheritance in AngularJS?

0

Dyrektywa ta będzie obejmować częściowe bez tworzenia nowego zakresu. Dla przykładu możesz utworzyć formularz w częściowym i kontrolować ten formularz z kontrolera nadrzędnego.

Oto link to the Repo, który dla niego stworzyłem.

oparłem moją odpowiedź na this S.O. answer powodzenia :-)