Istnieją dwa wzorce dostępu do funkcji kontrolera: this
i $scope
.
Którego należy użyć i kiedy? Rozumiem, że this
jest ustawiony na kontroler i $scope
jest obiektem w łańcuchu zasięgu dla widoków. Ale dzięki nowej składni „Controller as Var” możesz z łatwością używać obu. Pytam więc, co jest najlepsze i jaki jest kierunek na przyszłość?
Przykład:
Za pomocą
this
function UserCtrl() { this.bye = function() { alert('....'); }; }
<body ng-controller='UserCtrl as uCtrl'> <button ng-click='uCtrl.bye()'>bye</button>
Za pomocą
$scope
function UserCtrl($scope) { $scope.bye = function () { alert('....'); }; }
<body ng-controller='UserCtrl'> <button ng-click='bye()'>bye</button>
Osobiście uważam, że this.name
jest łatwiejsza dla oka i bardziej naturalna w porównaniu do innych wzorców OO Javascript.
Porada proszę?
Odpowiedzi:
Oba mają swoje zastosowania. Po pierwsze, trochę historii ...
$ scope jest „klasyczną” techniką, podczas gdy „kontroler jako” jest znacznie nowszy (od wersji 1.2.0 oficjalnie, chociaż wcześniej pojawiał się w niestabilnych wersjach wstępnych).
Oba działają idealnie dobrze, a jedyną złą odpowiedzią jest mieszanie ich w tej samej aplikacji bez wyraźnego powodu. Szczerze mówiąc, mieszanie ich będzie działać, ale tylko zwiększy zamieszanie. Więc wybierz jeden i rzuć nim. Najważniejsze jest zachowanie spójności.
Który? To zależy od Ciebie. Istnieje wiele innych przykładów $ scope, ale „kontroler jako” również zbiera parę. Czy jedno jest lepsze od drugiego? To jest dyskusyjne. Jak więc wybierasz?
Komfort
Wolę „kontroler jako”, ponieważ lubię ukrywać zakres $ i wystawiać członków z kontrolera na widok za pośrednictwem obiektu pośredniego. Ustawiając to. *, Mogę ujawnić tylko to, co chcę pokazać ze sterownika do widoku. Możesz to zrobić również za pomocą $ scope, po prostu wolę używać do tego standardowego JavaScript. W rzeczywistości koduję to w ten sposób:
Wydaje mi się to czystsze i ułatwia zobaczenie, co jest wystawiane na widok. Zauważ, że nazywam zmienną, którą zwracam, „vm”, co oznacza viewmodel. To tylko moja konwencja.
Z $ scope mogę robić te same rzeczy, więc nie dodawam ani nie umniejszam techniki.
To zależy od ciebie.
Iniekcja
Z $ scope muszę wprowadzić $ scope do kontrolera. Nie muszę tego robić z kontrolerem, chyba że potrzebuję go z innego powodu (np. $ Broadcast lub zegarki, chociaż staram się unikać zegarków w kontrolerze).
AKTUALIZACJA Napisałem ten post o 2 opcjach: http://www.johnpapa.net/do-you-like-your-angular-controllers-with-or-without-sugar/
źródło
var vm = this;
czy w widoku musisz też nazwać to „vm”? „kontroler jako vm”. Czy muszą być takie same?$scope
jest usuwany w Angular 2.0. W związku z tym używaniethis
byłoby podejściem, które inni chcieliby zastosować , gdy zbliża się data wydania Angulara 2.0.źródło
Moim zdaniem „to” w javascript ma wystarczająco dużo problemów, a dodanie do niego innego znaczenia / zastosowania nie jest dobrym pomysłem.
Dla jasności użyłbym $ scope.
AKTUALIZACJA
Omówiono tutaj składnię „kontrolera jako” . Nie jestem fanem, ale teraz, gdy jest to bardziej „oficjalny” konstrukt AngularJS, zasługuje na trochę uwagi.
źródło
Myślę, że Controller As jest lepszy, ponieważ pozwala na łatwiejsze zagnieżdżanie zakresów, jak opisał Todd Motto tutaj:
http://toddmotto.com/digging-into-angulars-controller-as-syntax/
Zapewni to również, że zawsze masz co najmniej jeden. w twoim wiążącym wyrażeniu, które zmusza cię do podążania za poleceniem „ nie wiąż” z prymitywami .
Dodatkowo możesz odłączyć od zakresu, który odchodzi w wersji 2.0.
źródło
Dokumentacja Angulara wyraźnie mówi, że
this
zalecane jest używanie . To, oprócz tego, że$scope
jest usuwane, jest wystarczającym powodem, żebym nigdy tego nie używał$scope
.źródło
„Zakres $ został usunięty w Angular 2.0” jason328 to dla mnie dobry powód. I znalazłem inny powód, aby pomóc mi dokonać wyboru:
this
jest bardziej czytelny - kiedy widzęfooCtrl.bar
w HTML, od razu wiem, gdzie znaleźć definicjębar
.Aktualizacje: niedługo po przejściu na
this
rozwiązanie zacząłem ominąć$scope
sposób, który wymaga mniej pisaniaźródło
Wolę kombinację.
Pokaże to prosty console.log $ scope i „to” po zapełnieniu ich próbnymi danymi.
Zakres $ umożliwia dostęp do części kontrolera pod przykryciem, na przykład:
** Właściwości i metody z $$ nie są zalecane do manipulowania przez zespół Angular, ale $ może być bezpieczną grą do robienia fajnych rzeczy z $ parent i $ id.
„to” przechodzi od razu do sedna, łącząc dane i funkcje dwukierunkowe. Zobaczysz tylko to, co załączyłeś:
Dlaczego więc wolę kombinację?
W aplikacjach zagnieżdżonych ui-router mogę uzyskać dostęp do głównego kontrolera, ustawić i wywołać uniwersalne wartości i funkcje w kontrolerze podrzędnym:
W głównym kontrolerze:
W kontrolerze podrzędnym:
Teraz możesz uzyskać dostęp do rodzica z poziomu dziecka i dziecka od rodzica!
źródło
Oba działają, ale jeśli zastosujesz rzeczy odpowiednie dla zakresu do $ scope, i jeśli zastosujesz rzeczy odpowiednie dla kontrolera do kontrolera, twój kod będzie łatwy do utrzymania. Ludziom, którzy mówią „Ugh, po prostu używaj zakresu, zapomnij o tym kontrolerze jako składni” ... To może działać tak samo, ale zastanawiam się, jak będziesz w stanie utrzymać ogromną aplikację bez utraty rzeczy.
źródło