$ ใช้เทียบกับ $ Digestive ในการทดสอบคำสั่ง


98

หากฉันมีคำสั่งที่ตอบสนองต่อสถานะของแอตทริบิวต์เฉพาะในขอบเขตและฉันต้องการเปลี่ยนแอตทริบิวต์นั้นในการทดสอบของฉันและตรวจสอบว่าแอตทริบิวต์นั้นตอบสนองอย่างถูกต้องวิธีใดที่ดีที่สุดในการเปลี่ยนแปลงนั้น

ฉันเคยเห็นทั้งสองรูปแบบนี้:

scope.$apply(function() {
    scope.myAttribute = true;
});

และ

scope.myAttribute = true;
scope.$digest();

อะไรคือความแตกต่างระหว่างสิ่งที่ดีกว่าและทำไม

คำตอบ:


207

scope.$digest()จะยิงผู้เฝ้าดูในขอบเขตปัจจุบันและลูก ๆ ทุกคนด้วย จะมีการประเมินการทำงานผ่านไปและวิ่งscope.$apply$rootScope.$digest()

อันแรกเร็วกว่าเนื่องจากต้องประเมินผู้เฝ้าดูสำหรับขอบเขตปัจจุบันและลูก ๆ อันที่สองช้ากว่าเนื่องจากต้องประเมินผู้เฝ้าดู$rootScopeและทั้งหมดเป็นขอบเขตของเด็ก

เมื่อมีข้อผิดพลาดเกิดขึ้นกับผู้เฝ้าดูคนใดคนหนึ่งและคุณใช้scope.$digestมันจะไม่ได้รับการจัดการผ่าน$exceptionHandlerบริการดังนั้นคุณต้องจัดการข้อยกเว้นด้วยตัวเอง scope.$applyใช้บล็อกภายในและผ่านข้อยกเว้นทั้งหมดเพื่อtry-catch$exceptionHandler


1
จะ$digestเรียกลูกของขอบเขตด้วยหรือเปล่า
pilau

16
ซึ่งอาจทำให้เข้าใจผิดได้ $digestไม่เพียง แต่นักดูไฟในขอบเขตปัจจุบัน แต่ยังรวมถึงลูก ๆ ทุกคนด้วย
tasseKATT

@tasseKATT ฉันคิดว่าฉันเข้าใจความคิดเห็นของคุณแนะนำแล้ว
activedecay

12

ในฐานะที่เป็นเอกสารของตัวเองกล่าวถึง $ ย่อยวงจรเป็น peformed $scope.$applyเวลาที่คุณทำ ตามคู่มือสำหรับนักพัฒนาเกี่ยวกับขอบเขต

หลังจากประเมินนิพจน์แล้วเมธอด $ apply จะทำการย่อย $ ในขั้นตอน $ Digest ขอบเขตจะตรวจสอบนิพจน์ $ watch ทั้งหมดและเปรียบเทียบกับค่าก่อนหน้า

และตามเอกสาร Scope API

โดยปกติคุณจะไม่เรียก $ Digest () โดยตรงในตัวควบคุมหรือในคำสั่ง แทนที่จะเรียก $ apply () (โดยทั่วไปจากภายในคำสั่ง) จะบังคับให้ $ Digest ()

ดังนั้นคุณไม่ควรเรียกอย่างชัดเจนวิธีการ$digestเรียกของคุณ$applyจะทริกเกอร์วงจรการย่อย


8
สิ่งนี้ไม่เป็นความจริงเนื่องจากการสรุปข้อมูลเพียงพอสำหรับกรณีส่วนใหญ่ที่ต้องประเมินเฉพาะขอบเขตปัจจุบันและลูกของมันเท่านั้น มันเป็นความจริงที่ $ ขอบเขต $ ใช้เรียก $ แยกย่อยภายใน แต่สิ่งสำคัญมากที่ต้องจำไว้ว่ามันจะจบลงด้วยการเรียก $ rootScope $ Digest () และด้วยเหตุนี้จึงหนักมาก
Srivathsa Harish Venkataramana
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.