2014-09-26 24 views
5

anti-patterns sunan bu belgeyi okuyorum ve orada şu var: Don if (!$scope.$$phase) $scope.$apply() yapmayın, $scope.$apply() çağrı yığında yeterince yüksek değil demektir. Herkes bana bunun ne anlama geldiğini açıklayabilir mi?

Özellikle, isn't high enough in the call stack bölümüyle ilgileniyorum. $$phase ve $apply'un ne olduğunu ve neden kullanıldığını biliyorum. Yığında yeterince yüksek olmayan bir kapsam örneğini görmek harika olurdu.

cevap

1

çağrı yığını belli bir işlev tarafından yapılan aramaların zinciridir ther olunca konsola içeride gördüğünüz gibi javascript hatası. Örnek

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) 

Bu için bir çağrı yığın. Şimdi tüm fonksiyon döngüsü bittiğinde $ apply() func çağrılmalıdır, bu yüzden çağrı yığınının en yüksek seviyesinde olması gerektiğini belirtir. Çünkü her işlemin güvenli bir $ apply() yapmak için yapıldığından emin olmalısınız, çünkü bildiğiniz gibi aynı $ kapsamında bir kerede 2 sindirme döngüsü yapamazsınız.

Yani varsa

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

Kişisel $ uygulamak() çağrısı olmanın o, bir() fonk içeride olmalı çağrı yığını yüksek seviye.

0

Bu, kodunuzda bir yerde (! $ Scope. $$ phase) $ scope. $ Apply() öğesinin göründüğü anlamına gelir. Çünkü en uygun durumda $ scpoe. $$ fazını kontrol etmeniz gerekmez. $$ aşaması, dahili olarak açısal olarak kullanılan ve uygulama kodunda kullanılmaması gereken bir özelliktir. $$ aşaması temel olarak, $ digest döngüsünün zaten ilerlediğini gösteren bir boolean özelliğidir (açısal, model güncellemelerini kontrol etmek için kullanır). Eğer $ başvurusu yaparsanız, o zaman $ digest fazını başlatmak için açısal olduğunu söylersiniz (model güncellemelerini kontrol edin). Bunu, yalnızca açısal kodun dışındaki modeli güncellemek istiyorsanız (örneğin jquery eklentisi geri aramalarında) elle yapmanız gerekir.

Sana içeriden açısal öğrenmek istiyorsanız bu harika makaleyi okumanızı tavsiye: http://teropa.info/blog/2013/11/03/make-your-own-angular-part-1-scopes-and-digest.html

+2

Teşekkürler, 'çağrı yığını' bölümünde yeterince yüksek değil. Bildiğim her şey) –