2013-07-12 14 views
64

W teledysku AngularJS MTV Meetup: Best Practices (2012/12/11) Miško wyjaśnia „..if użyć ng model nie musi być kropka gdzieś. Jeśli nie masz kropkę, robisz to źle ..”Dlaczego dokumenty AngularJS nie używają kropki w dyrektywie modelowej?

jednak pierwszy przykład (The Basics) w Angular.JS website wydaje się temu przeczyć. Co daje? Czy Angular.JS zmienił się od czasu spotkania MTV, że jest teraz bardziej wybaczający dzięki modelowi ng?

+0

Osobiście uważam, że to bardziej przypomina problem filozofii dotyczący modelowania systemu. Niektórzy używają '$ scope' jako modelu widoku, a inni nie. Jest to kwestia preferencji. – yuxhuang

+0

Zobacz http: // stackoverflow.com/questions/15623698/directive-isolate-scope-with-ng-repeat-scope/15645354 # 15645354 – yanhan

Odpowiedz

101

Ta mała kropka jest bardzo ważne, gdy mamy do czynienia ze złożonością zakresu dziedziczenia.

egghead.io video "The Dot" ma naprawdę dobry przegląd, jak robi to bardzo popularny przepełnienia stosu pytanie: What are the nuances of scope prototypal/prototypical inheritance in AngularJS?

postaram się go streścić tutaj:

angularjs używa zakresu dziedziczenia, aby umożliwić dziecku zakresu (taki jak kontroler podrzędny), aby zobaczyć właściwości zakresu nadrzędnego. Więc powiedzmy, że miał konfigurację takiego:

<div ng-controller="ParentCtrl"> 
    <input type="text" ng-model="foo"/> 
    <div ng-controller="ChildCtrl"> 
     <input type="text" ng-model="foo"/> 
    </div> 
</div> 

(Play along on a JSFiddle)

Początkowo, jeśli rozpoczął aplikację, i wpisany do wejścia nadrzędnego, dziecko będzie zaktualizować go do refleksji.

Jednak w przypadku edycji zakresu podrzędnego połączenie z rodzicem jest teraz zepsute, a dwa z nich nie są już synchronizowane. Z drugiej strony, jeśli użyjesz ng-model="baz.bar", link pozostanie.

Przyczyną takiego działania jest to, że zakres podrzędny korzysta z prototypowego dziedziczenia w celu sprawdzenia wartości, tak długo, jak długo nie zostanie ustawiony na potomku, wówczas będzie odraczał zakres nadrzędny. Ale po jej ustawieniu nie sprawdza już rodzica.

Jeśli zamiast tego zostanie użyty obiekt (baz), nic nie zostanie ustawione w zakresie podrzędnym, a dziedziczenie pozostanie.

Więcej szczegółów pogłębionych, sprawdź StackOverflow answer

+3

To wideo z jajem jest warte swojej wagi w złocie. Najlepszy opis tego problemu, nigdy. –

+0

Co za zwięzłe podsumowanie - fantastyczne. – drjimmie1976

+1

Czy jestem jedynym, który myśli, że dodanie dowolnych zmiennych kontenerowych jest niesamowicie brzydki? Rozumiem, dlaczego jest to "najlepsza praktyka", ale jest tak brzydko widzieć zmienne losowe zawierające rzeczy, które naprawdę się liczą. Właściwie to staram się unikać tej "najlepszej praktyki" z tego powodu. Nieczęsto napotykam na jakiekolwiek problemy, ponieważ pamiętam o konsekwencjach. Nie ukąszono mnie przez ponad rok intensywnego, kanciastego rozwoju. – Spencer

17

Kropka będzie wymagana, gdy prototypowo dziedziczy się jeden zakres od drugiego, na przykład w przypadku ng-repeat nowy zakres jest tworzony dla każdego elementu zamówienia, który prototypowo dziedziczy z zakresu nadrzędnego. W podstawowym przykładzie nie ma dziedziczenia prototypów, ponieważ istnieje tylko jeden zakres, ale jeśli masz wiele zakresów potomnych, zaczniesz stawać przed problemem. Poniższy link wszystko wyjaśni.

https://github.com/angular/angular.js/wiki/Understanding-Scopes#ng-repeat

0

Tak, aby rozwiązać ten problem, upewnij się, że w JS zadeklarować pierwszy dominującej:

np

$scope.parent 

następuje:

$scope.parent.child = "Imma child"; 

robi tylko dziecko bez rodzica złamie kątowe.

Powiązane problemy