ฉันเข้าใจng-show
และng-hide
ส่งผลต่อคลาสที่ตั้งค่าไว้บนองค์ประกอบและng-if
ควบคุมว่าจะให้องค์ประกอบแสดงผลเป็นส่วนหนึ่งของ DOM หรือไม่
จะมีแนวทางในการเลือกng-if
มากกว่าng-show
/ ng-hide
หรือในทางกลับกัน?
ฉันเข้าใจng-show
และng-hide
ส่งผลต่อคลาสที่ตั้งค่าไว้บนองค์ประกอบและng-if
ควบคุมว่าจะให้องค์ประกอบแสดงผลเป็นส่วนหนึ่งของ DOM หรือไม่
จะมีแนวทางในการเลือกng-if
มากกว่าng-show
/ ng-hide
หรือในทางกลับกัน?
คำตอบ:
ขึ้นอยู่กับกรณีการใช้งานของคุณ แต่เพื่อสรุปความแตกต่าง:
ng-if
จะลบองค์ประกอบออกจาก DOM ซึ่งหมายความว่าตัวจัดการของคุณทั้งหมดหรือสิ่งอื่นใดที่ติดอยู่กับองค์ประกอบเหล่านั้นจะหายไป ตัวอย่างเช่นหากคุณเชื่อมโยงตัวจัดการคลิกเข้ากับองค์ประกอบย่อยหนึ่งองค์ประกอบเมื่อng-if
ประเมินเป็นเท็จองค์ประกอบนั้นจะถูกลบออกจาก DOM และตัวจัดการการคลิกของคุณจะไม่ทำงานอีกng-if
ต่อไปแม้หลังจากประเมินเป็นจริงในภายหลังและแสดงองค์ประกอบนั้น คุณจะต้องใส่ตัวจัดการกลับเข้าไปใหม่ng-show/ng-hide
ไม่ลบองค์ประกอบออกจาก DOM มันใช้สไตล์ CSS เพื่อซ่อน / แสดงองค์ประกอบ (หมายเหตุ: คุณอาจต้องเพิ่มคลาสของคุณเอง) วิธีนี้เครื่องจัดการของคุณที่ติดมากับเด็กจะไม่สูญหายng-if
สร้างขอบเขตลูกในขณะที่ng-show/ng-hide
ไม่องค์ประกอบที่ไม่ได้อยู่ใน DOM มีผลกระทบต่อประสิทธิภาพน้อยลงและเว็บแอปของคุณอาจดูเหมือนจะเร็วขึ้นเมื่อใช้เมื่อเทียบกับng-if
ng-show/ng-hide
จากประสบการณ์ของฉันความแตกต่างนั้นเล็กน้อย ภาพเคลื่อนไหวเป็นไปได้เมื่อใช้ทั้งสองng-show/ng-hide
และng-if
ตัวอย่างสำหรับทั้งในเอกสารประกอบเชิงมุม
ท้ายที่สุดคำถามที่คุณต้องตอบคือคุณสามารถลบองค์ประกอบออกจาก DOM หรือไม่?
ng-if
ได้ ตรวจสอบวรรคภาพเคลื่อนไหวและตัวอย่างในเอกสาร นอกจากนี้ยังมีng-hide/ng-show
ตัวเลือก css เช่น:first-child
หรือ:nth-child
ไม่ทำงานอย่างถูกต้องเนื่องจากองค์ประกอบที่ซ่อนอยู่จะถูกนับด้วย
ng-if
สร้างขอบเขตใหม่ในขณะที่ng-show
ไม่ได้
ดูที่นี่สำหรับ CodePen ที่แสดงให้เห็นถึงความแตกต่างในการทำงานของ ng-if / ng-show, DOM-wise
@markovuksanovic ตอบคำถามได้ดี แต่ฉันมาจากมุมมองอื่น: ฉันมักจะใช้ng-if
และนำองค์ประกอบเหล่านั้นออกจาก DOM ยกเว้น:
$watch
-es ในองค์ประกอบของคุณเพื่อให้สามารถใช้งานได้ในขณะที่มองไม่เห็น แบบฟอร์มอาจเป็นกรณีที่ดีสำหรับสิ่งนี้ถ้าคุณต้องการตรวจสอบความถูกต้องของอินพุตที่ไม่สามารถมองเห็นได้ในปัจจุบันเพื่อตรวจสอบว่าแบบฟอร์มทั้งหมดนั้นถูกต้องหรือไม่เชิงมุมเขียนได้ดีมาก มันรวดเร็วโดยพิจารณาว่ามันทำอะไร แต่สิ่งที่ทำคือกลุ่มของเวทมนตร์ที่ทำให้สิ่งที่ยาก (เช่นการผูกข้อมูลแบบสองทาง) ดูง่ายเล็กน้อย การทำให้ทุกสิ่งดูง่ายทำให้เกิดประสิทธิภาพการทำงานสูง คุณอาจตกใจเมื่อรู้ว่ามีหลายร้อยหรือหลายพันเท่าที่ฟังก์ชั่นเซทเทอร์ได้รับการประเมินในระหว่าง$digest
รอบของ DOM ที่ก้อนใหญ่ไม่มีใครดู แล้วคุณก็รู้ว่าคุณมีองค์ประกอบที่มองไม่เห็นนับร้อยหรือร้อยทั้งหมดทำสิ่งเดียวกัน ...
เดสก์ท็อปอาจมีประสิทธิภาพเพียงพอที่จะแสดงผลปัญหาการประมวลผลความเร็ว JS ส่วนใหญ่ แต่ถ้าคุณพัฒนามือถือให้ใช้ ng-if ทุกครั้งที่เป็นไปได้อย่างมนุษย์ปุถุชน ความเร็วของ JS ยังมีความสำคัญกับโปรเซสเซอร์มือถือ การใช้ ng-if เป็นวิธีที่ง่ายมากในการเพิ่มประสิทธิภาพที่สำคัญซึ่งอาจมีค่าใช้จ่ายต่ำมาก
ng-show
มีประโยชน์เมื่อคุณพูดแท็บแต่ละรายการที่มีเนื้อหาจำนวนมากที่ต้องใช้เวลาในการแสดงผล หลังจากการเรนเดอร์ครั้งแรกการย้ายไปมาระหว่างแท็บจะเกิดขึ้นทันทีในขณะที่ng-if
ต้องการการเรนเดอร์ใหม่, เชื่อมเหตุการณ์ต่าง ๆ เป็นต้นข้อเสียอย่างที่คุณพูดก็คือ เชิงมุมหมดความต้องการng-ifshowwatch
จากประสบการณ์ของฉัน:
1) หากหน้าของคุณมีการสลับที่ใช้ ng-if / ng-show เพื่อแสดง / ซ่อนบางสิ่ง ng-if ทำให้เบราว์เซอร์ล่าช้ามากขึ้น (ช้าลง) ตัวอย่างเช่น: หากคุณมีปุ่มที่ใช้ในการสลับระหว่างสองมุมมอง ng-show น่าจะเร็วกว่า
2) ng-if จะสร้าง / ทำลายขอบเขตเมื่อประเมินเป็นจริง / เท็จ หากคุณมีคอนโทรลเลอร์ติดอยู่กับ ng-if รหัสคอนโทรลเลอร์นั้นจะถูกเรียกใช้งานทุกครั้งที่ ng-if ประเมินผลเป็นจริง หากคุณใช้ ng-show รหัสคอนโทรลเลอร์จะได้รับการดำเนินการเพียงครั้งเดียว ดังนั้นหากคุณมีปุ่มที่สลับระหว่างมุมมองหลายมุมมองการใช้ ng-if และ ng-show จะสร้างความแตกต่างอย่างมากในวิธีที่คุณเขียนรหัสคอนโทรลเลอร์ของคุณ
คำตอบนั้นไม่ง่าย:
มันขึ้นอยู่กับเครื่องเป้าหมาย (มือถือเทียบกับเดสก์ท็อป) มันขึ้นอยู่กับลักษณะของข้อมูลเบราว์เซอร์ระบบปฏิบัติการฮาร์ดแวร์ที่ทำงานบน ... คุณจะต้องสร้างมาตรฐานหากคุณต้องการรู้จริง ๆ
มันเป็นปัญหาการคำนวณหน่วยความจำส่วนใหญ่ ... เช่นเดียวกับปัญหาด้านประสิทธิภาพส่วนใหญ่ความแตกต่างอาจมีความสำคัญกับองค์ประกอบที่ซ้ำ ๆ (n) เช่นรายการโดยเฉพาะอย่างยิ่งเมื่อซ้อน (nxn หรือแย่กว่า) และการคำนวณที่คุณใช้ในองค์ประกอบเหล่านี้ :
ng-show : หากองค์ประกอบทางเลือกเหล่านั้นมักมีอยู่ (หนาแน่น) เช่นพูดว่า 90% ของเวลามันอาจจะเร็วกว่าที่จะให้พวกเขาพร้อมและแสดง / ซ่อนเฉพาะโดยเฉพาะอย่างยิ่งถ้าเนื้อหาของพวกเขาราคาถูก (แค่ข้อความธรรมดาไม่มีอะไรเลย เพื่อคำนวณหรือโหลด) วิธีนี้ใช้หน่วยความจำเมื่อเติม DOM ด้วยองค์ประกอบที่ซ่อนอยู่ แต่เพียงแสดง / ซ่อนบางสิ่งที่มีอยู่แล้วน่าจะเป็นการใช้งานที่ถูกสำหรับเบราว์เซอร์
ng-if : หากองค์ประกอบที่ตรงกันข้ามมีแนวโน้มว่าจะไม่แสดง (กระจัดกระจาย) เพียงแค่สร้างและทำลายพวกเขาแบบเรียลไทม์โดยเฉพาะอย่างยิ่งหากเนื้อหาของพวกเขามีราคาแพงที่จะได้รับ (การคำนวณ / เรียง / กรอง / กรองภาพสร้างภาพ) เหมาะสำหรับองค์ประกอบที่หายากหรือ 'ตามคำขอ' ช่วยประหยัดหน่วยความจำในแง่ของการไม่เติม DOM แต่สามารถใช้การคำนวณจำนวนมาก (การสร้าง / ทำลายองค์ประกอบ) และแบนด์วิดท์ (รับเนื้อหาจากระยะไกล) นอกจากนี้ยังขึ้นอยู่กับจำนวนที่คุณคำนวณในมุมมอง (การกรอง / การเรียงลำดับ) เทียบกับสิ่งที่คุณมีในโมเดล (ข้อมูลที่เรียงลำดับล่วงหน้า / กรองล่วงหน้า)
หมายเหตุสำคัญหนึ่ง:
ngIf (ไม่เหมือน ngShow) มักจะสร้างขอบเขตของเด็กที่อาจให้ผลลัพธ์ที่ไม่คาดคิด
ฉันมีปัญหาเกี่ยวกับสิ่งนี้และฉันใช้เวลามากในการคิดว่าเกิดอะไรขึ้น
(คำสั่งของฉันกำลังเขียนค่ารุ่นไปยังขอบเขตที่ไม่ถูกต้อง)
ดังนั้นเพื่อประหยัดผมของคุณเพียงใช้ ngShow จนกว่าคุณจะทำงานช้าเกินไป
ความแตกต่างของการทำงานนั้นแทบจะไม่น่าสังเกตเลยและฉันก็ยังไม่แน่ใจว่าใครที่ชอบคือมันโดยไม่ต้องทดสอบ ...
$parent.scopevar
ในการผูกข้อมูลภายในngIfจะแก้ไขสิ่งต่าง ๆ เช่นปัญหาขอบเขตเด็กเมื่อใช้ngIf
ngIf
เชื่อว่าสิ่งนี้จะปรับปรุงประสิทธิภาพการทำงานทุกที่ สิ่งนี้ไม่เป็นความจริงและไม่สามารถบอกได้ว่าสิ่งใดดีที่สุดngIf
หรือngShow
ไม่มีการทดสอบหรือการวิเคราะห์เชิงลึกในกรณีเฉพาะ ดังนั้นฉันยังคงแนะนำให้ลืมngIf
จนกว่าจะมีใครเห็นประสิทธิภาพที่ไม่ดีหรือรู้ว่าเขากำลังทำอะไรอยู่
ng-if บน ng-include และ ng-controller จะมีผลกระทบอย่างมากกับ ng-include มันจะไม่โหลดบางส่วนที่ต้องการและไม่ดำเนินการจนกว่าการตั้งค่าสถานะเป็นจริงบน ng-controller มันจะไม่โหลดตัวควบคุมเว้นแต่จะตั้งค่าสถานะ จริง แต่ปัญหาคือเมื่อแฟล็กได้รับ false ใน ng-if มันจะลบออกจาก DOM เมื่อแฟล็กได้รับจริงมันจะรีโหลด DOM ในกรณีนี้ ng-show ดีกว่าสำหรับการแสดงครั้งเดียว ng-if ดีกว่า
ถ้าคุณใช้ ng-show or ng-hide
เนื้อหา (เช่นรูปขนาดย่อจากเซิร์ฟเวอร์) จะโหลดโดยไม่คำนึงถึงค่าของนิพจน์ แต่จะแสดงตามค่าของนิพจน์
หากคุณใช้ng-if
เนื้อหาจะถูกโหลดเฉพาะในกรณีที่การแสดงออกของ ng-if ประเมินว่าเป็นความจริง
การใช้ ng-if เป็นความคิดที่ดีในสถานการณ์ที่คุณกำลังจะโหลดข้อมูลหรือภาพจากเซิร์ฟเวอร์และแสดงเฉพาะขึ้นอยู่กับการโต้ตอบของผู้ใช้ วิธีนี้การโหลดหน้าเว็บของคุณจะไม่ถูกบล็อกโดยงานที่ไม่จำเป็นซึ่งไม่จำเป็น
src
คุณสมบัติของimg
แท็กเมื่อมันได้รับการโหลด!