2014-09-26 11 views
5

Czytam ten dokument, który prezentuje anty-wzory i jest tam: Don 't do if (!$scope.$$phase) $scope.$apply(), oznacza to, że Twój $scope.$apply() nie jest wystarczająco wysoki w stosie wywołań. Czy ktoś może mi wyjaśnić, co to znaczy?

Szczególnie interesuje mnie część isn't high enough in the call stack. Wiem, co to jest $$phase i $apply i dlaczego jest używany. Byłoby wspaniale widzieć przykład zakresu nie będącego wystarczająco wysoko w stosie.

Odpowiedz

1

Stos wywołań jest sieć połączeń wykonanych przez pewną funkcję, jak to, co można zobaczyć wewnątrz konsoli gdy Ther jest błąd javascript. Na przykład

at Scope.$scope.openRightMenu (site/header.ctr.js:19:12) 
     at Parser.functionCall (site/bower_components/angular/angular.js:10567:21) 
     at site/bower_components/angular-touch/angular-touch.js:438:9 
     at Scope.$get.Scope.$eval (site/bower_components/angular/angular.js:12412:28) 
     at Scope.$get.Scope.$apply (site/bower_components/angular/angular.js:12510:23) 
     at HTMLDivElement.<anonymous> (site/bower_components/angular-touch/angular-touch.js:437:13) 

To jest stos połączeń. Teraz funkcja $ apply() musi zostać wywołana, gdy cały cykl funkcji zostanie zakończony, dlatego mówi, że powinien znajdować się na najwyższym poziomie stosu wywołań. Ponieważ musisz być pewien, że każdy proces jest wykonywany w celu bezpiecznego użycia $ apply() również, ponieważ, jak wiesz, nie możesz wykonać 2 cykli fermentacji na tym samym $ scope na raz.

Więc jeśli mają zastosowanie

func a() -> calling -> func b() //setting $scope elaborated data 
func b() -> calling -> func c() //elaborating data 
func c() -> calling -> func d() //getting data 

Twoje $() wezwanie powinno być wewnątrz func a(), jest to najwyższy poziom stosie wywołań.

0

Oznacza to, że widzisz, czy (! $ Scope. $$ phase) $ scope. $ Apply() gdzieś w kodzie, to prawdopodobnie coś nie tak. Ponieważ w optymalnej sytuacji nie musisz sprawdzać dla $ scpoe. $$ phase. Faza $$ jest właściwością używaną wewnętrznie przez kąt i nie powinna być używana w kodzie aplikacji. Faza $$ to w zasadzie właściwość boolowska, która wskazuje, że już jest postępująca pętla $ digest (kątowa używa jej do sprawdzania aktualizacji modelu). Jeśli wywołasz $ apply, poinformuj kanalik, aby rozpocząć fazę $ digest (sprawdź aktualizacje modelu). Trzeba to zrobić ręcznie tylko wtedy, gdy chcesz zaktualizować model poza zakodowanym kodem (na przykład w przypadku wywołań jQuery).

polecam przeczytać ten wielki artykuł, jeśli chcesz dowiedzieć się kątowa od wewnątrz: http://teropa.info/blog/2013/11/03/make-your-own-angular-part-1-scopes-and-digest.html

+2

Dzięki, jestem zainteresowany 'nie jest wystarczająco wysoki w części stosu wywołań". Wszystko inne, co wiem) –