ตำแหน่งของคำสั่ง ng-app (html vs body)


103

ฉันเพิ่งตรวจสอบโค้ดสำหรับเว็บแอปที่สร้างด้วยเชิงมุมและพบว่ามีการเขียนโค้ดโดยng-app="myModule"วางคำสั่งไว้บน<body>แท็ก เมื่อเรียนรู้เชิงมุมฉันเท่านั้นที่เคยเห็นมันใช้กับ<html>แท็กตามคำแนะนำของเอกสารเชิงมุมที่นี่ , ที่นี่และในของพวกเขากวดวิชา

ผมได้สำรวจนี้บิตของตัวเองและพบว่า SO คำถามสะดุดตานี้และในทำนองเดียวกันนี้ที่หารือเกี่ยวกับการโหลดโมดูลหลายหน้า อย่างไรก็ตามเทคนิคนี้แตกต่างจากกรณีของฉันเนื่องจากเกี่ยวข้องกับการวาง ng-app บนองค์ประกอบภายในร่างกายและใช้การบูตด้วยตนเองเพื่อเรียกใช้แอปเชิงมุมสองแอปในเวลาเดียวกัน

เท่าที่ฉันสามารถบอกได้ไม่มีความแตกต่างระหว่างรันไทม์ระหว่างแอพที่ng-appเปิด<html>หรือ<body>. ตามที่ฉันเข้าใจมันng-appกำหนดรูทของแอปพลิเคชันเชิงมุมดังนั้นการจัดวางบนส่วนบน<body>จะตัด<head>ออกจากขอบเขตของเชิงมุม แต่ฉันคิดไม่ออกว่าจะมีผลกระทบต่อสิ่งต่าง ๆ อย่างไร คำถามของฉันคืออะไรคือความแตกต่างทางเทคนิคระหว่างการวางng-appบนแท็กเหล่านี้แทนที่จะเป็นอีกแท็ก

คำตอบ:


144

ng-appไม่มีความแตกต่างใหญ่ที่คุณใส่เป็น

หากคุณใส่ไว้<body>คุณจะมีขอบเขตที่เล็กกว่าสำหรับ AngularJS ซึ่งเร็วกว่าเล็กน้อย

แต่ฉันได้ใช้ng-appในการ<html>จัดการไฟล์<title>.


ขอบคุณสำหรับคำตอบ! นี่เป็นข้อสรุปโดยพื้นฐานที่ฉันได้รับดังนั้นจึงเป็นเรื่องดีที่ได้ยินว่าคนอื่นคิดไปในแนวเดียวกัน ฉันสนใจว่าทำไมมันถึงเร็วกว่าและเร็วแค่ไหนคุณสามารถอธิบายเพิ่มเติมได้หรือคุณมีข้อมูลอ้างอิงที่สามารถอธิบายสิ่งนี้ได้หรือไม่?
MattDavis

10
ฉันหมายถึงเร็วขึ้นเล็กน้อย มันมีน้อย ขอบเขตที่เล็กลงหมายถึงองค์ประกอบที่ AngularJS มองหาคำสั่งน้อยลง หากคุณมีองค์ประกอบเมตามากมายสำหรับ Open Graph เช่นอาจมีผลกระทบเล็กน้อย
Haralan Dobrev

12
หัวข้อ. นั่นคือเหตุผลที่แท้จริง
ahnbizcad

2
ฉันจะใช้จาวาสคริปต์ธรรมดาเพื่อเปลี่ยนชื่อเรื่อง
Sean_A91

3
@ Sean_A91 อย่างไรก็ตามหากคุณมีทั้งเพจที่รันโดย AngularJS มันสมเหตุสมผลกว่าที่จะใช้ Angular สำหรับสิ่งนั้น มีความสอดคล้องกันมากขึ้นซึ่งจะเพิ่มความสามารถในการบำรุงรักษาและคุณสามารถใช้แบบจำลองชื่อซ้ำในเนื้อหาของหน้าได้
Haralan Dobrev

21

ฉันอยู่ในทีมที่ทำงานกับแอปเดิมและพบว่าควรใช้แท็ก ng-app ใน div ที่ใช้เป็น wrapper เพื่อแยกรหัสใหม่ออกจากรหัสเดิม

เราค้นพบสิ่งนี้ในขณะที่ทำงานกับแอพที่อาศัย jqGrid และ Dojo เป็นอย่างมาก

เมื่อเราเพิ่ม ng-app ลงใน head tag มันจะทำให้ไซต์นั้นพัง แต่เมื่อเราใช้ wrapper เราสามารถใช้ Angular ได้โดยไม่มีปัญหา


14
นี่เป็นตัวอย่างที่ดีในการแยกความแตกต่างระหว่างกรณีการใช้งาน 3 แบบสำหรับ Angular ได้แก่ "แอปหน้าเดียว" "แบบสแตนด์อโลน" (เช่นใช้เวลามากกว่าหน้า แต่ใช้ลิงก์ปกติไปยังหน้าอื่น ๆ ) และ "มิกซ์อิน" (กล่าวคือเพียงเล็กน้อยบน หน้า). คุณได้อธิบายการใช้งาน mixin อย่างถูกต้องและในกรณีนั้น ng-app ที่ตกลงกันโดยสิ้นเชิงควรอยู่ใน div ที่ใช้ mixin เท่านั้น อย่างไรก็ตามสำหรับการใช้งานแบบสแตนด์อโลนหรือสปาฉันคิดว่าควรอยู่ใน <html>
fool4jesus

@ fool4jesus คุณเคยรู้บทความเกี่ยวกับตัวเลือกการใช้งานต่างๆสำหรับ Angular หรือไม่? แน่นอนว่ามีเวอร์ชัน SPA ที่แนะนำมากมาย แต่เมื่อเร็ว ๆ นี้ฉันต้องเพิ่ม Angular ลงในโค้ดเบส jQuery หนักและสงสัยว่าตัวเลือกที่ดีที่สุดคืออะไรที่จะใช้กับความสำเร็จและไม่บ้า
Senthe

นั่นอาจเป็นเรื่องยุ่งยาก @Senthe ดังที่คุณได้ค้นพบอย่างไม่ต้องสงสัย Angular ชอบที่จะรับผิดชอบ DOMain ของตัวเอง ฉันคิดว่ามันไม่ค่อยเกี่ยวกับพื้นที่ทับซ้อนของหน้าเว็บและเกี่ยวกับการควบคุมพื้นที่นั้น ๆ นั่นคือคุณยังสามารถใช้ jquery ในพื้นที่เชิงมุมได้ แต่เริ่มต้นด้วยรหัสเชิงมุม - ไม่ใช่เรื่องง่ายเมื่อมีเพจอยู่แล้ว! กล่าวอีกนัยหนึ่งไม่ใช่การเรียก jquery ที่ต้องดำเนินการมากเท่ากับสิ่งที่อยู่ระหว่างแท็ก <script> ต้องย้ายไปอยู่ในโครงสร้างเชิงมุม - คอนโทรลเลอร์และคำสั่ง มันสมเหตุสมผลไหม
fool4jesus

4

AngularJS จะ bootstrap แอพแรกที่พบ! แค่นั้นแหละ. หากคุณมี ng-app มากกว่าหนึ่งแอปจะประมวลผลแอปแรกเท่านั้น หากคุณต้องการบูตองค์ประกอบอื่น ๆ ให้ใช้ angular.bootstrap ()

ค่าของแอ็ตทริบิวต์ ng-app คือโมดูลที่สร้างขึ้นโดยใช้:

angular.module("module_name", [])

โมดูลจะกำหนดวิธีการบูตเชิงมุมเนื่องจากเราไม่มีเมธอด main () ซึ่งแตกต่างจากภาษาโปรแกรมอื่น ๆ หากค่าของ ng-app ว่างเปล่าค่าเริ่มต้นจะใช้ 'ng' ซึ่งเป็นโมดูลเริ่มต้น

มีการกล่าวกันว่าเร็วกว่าเล็กน้อยเนื่องจากเชิงมุมจะประมวลผลองค์ประกอบทั้งหมดภายในองค์ประกอบที่ ng-app อยู่ แต่ฉันสงสัยเล็กน้อยเพราะความแตกต่างแทบจะไม่สังเกตเห็นได้เลยเว้นแต่คุณจะมี DOM ที่ใหญ่มาก

หากคุณต้องการตัวอย่างที่นี่: http://noypi-linux.blogspot.com/2014/07/angularjs-tutorials-understand.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.