2015-07-13 13 views
5

Aşağıda test yönergesi için kullanılan çok yaygın bir jenerik senaryodur. Ben $compile(element) anlıyorum

var element,scope; 

beforeEach(inject(function ($rootScope,$compile) { 
    scope = $rootScope.$new() 
    element = angular.element('<div my-directive></div>') 
    $compile(element)(scope) 
    scope.$digest(); //why? 
})) 

almak bir işlevi döndüren bir kapsam parametresi ve bunu öğenin yönergesine sağlar. Ayrıca, scope.$digest()'un özet döngüsünü yürüttüğünü ve kirli denetimi başlattığını anlıyorum. Tüm bu soru ile, benim her şey bu durumda çalışır hale getirmek için $compile çağıran sonra neden scope.$digest aramak zorunda soru nedir?

cevap

9

Bu, bir yönergenin test edilmesi için genel bir koddur. $Compile, şablonu kapsam ile bağlar ve link işlevini çalıştırır ve $digest/$apply, link tarafından değiştirilmiş olabilecek modeller için bağlantıları yeniler.
$compile'u ng-click işleyicisinin içine veya denetleyici işlevine çağırdığınızda, tüm yürütme işlemi $digest döngüsünde gerçekleştirilir. Açısal, dinamik olarak eklenen öğelerin (bu döngüyü yürütürken) aynı döngüde yürüteceği şekilde oluşturulur. Bu yüzden farkı görmüyorsunuz ve derleme sonrasında bağlayıcı değerlendirmelere duyulan ihtiyacı fark etmiyorsunuz. Ancak, birim testlerde farklıdır, burada açısal olarak $digest döngüsünü manuel olarak yürütmeniz gerekir. Bu, örneğin, $q sözlerini test ederken sık sık sorun çıkarır.