AngularJS กับ jQuery
AngularJS และ jQuery ใช้แนวคิดที่แตกต่างกันมาก หากคุณมาจาก jQuery คุณอาจพบความแตกต่างที่น่าแปลกใจ เชิงมุมอาจทำให้คุณโกรธ
นี่เป็นเรื่องปกติคุณควรผลักดัน เชิงมุมมีค่า
ความแตกต่างใหญ่ (TLDR)
jQuery ให้ชุดเครื่องมือสำหรับคุณในการเลือกบิตของ DOM และทำการเปลี่ยนแปลง Ad-hoc คุณสามารถทำอะไรก็ได้ที่คุณชอบทีละชิ้น
AngularJS แทนที่จะช่วยให้คุณมีคอมไพเลอร์
สิ่งนี้หมายความว่า AngularJS อ่าน DOM ทั้งหมดของคุณจากบนลงล่างและถือว่าเป็นรหัสตามตัวอักษรตามคำแนะนำของคอมไพเลอร์ เมื่อสำรวจผ่าน DOM มันจะมองหาคำสั่งเฉพาะ(คำสั่งคอมไพเลอร์) ที่บอก AngularJS คอมไพเลอร์ว่าจะทำอย่างไร คำสั่งเป็นวัตถุขนาดเล็กที่เต็มไปด้วย JavaScript ซึ่งสามารถจับคู่กับแอตทริบิวต์แท็กคลาสหรือแม้แต่ความคิดเห็น
เมื่อคอมไพเลอร์ Angular พิจารณาว่าชิ้นส่วนของ DOM ตรงกับคำสั่งเฉพาะมันเรียกฟังก์ชั่นคำสั่งผ่านมันองค์ประกอบ DOM คุณลักษณะใด ๆ ขอบเขต $ ปัจจุบัน (ซึ่งเป็นที่เก็บตัวแปรท้องถิ่น) และบิตที่มีประโยชน์อื่น ๆ คุณลักษณะเหล่านี้อาจมีการแสดงออกซึ่งสามารถตีความได้โดยคำสั่งและที่บอกวิธีการแสดงผลและเมื่อมันควรวาดตัวเอง
คำสั่งนั้นจะสามารถดึงส่วนประกอบ Angular เพิ่มเติมเช่นตัวควบคุมบริการ ฯลฯ สิ่งที่ปรากฏออกมาด้านล่างของคอมไพเลอร์คือเว็บแอปพลิเคชั่นที่มีรูปแบบสมบูรณ์แบบมีสายและพร้อมใช้งาน
ซึ่งหมายความว่าเชิงมุมเป็นเทมเพลต เทมเพลตของคุณขับเคลื่อน JavaScript ไม่ใช่วิธีอื่น นี่คือการย้อนกลับของบทบาทอย่างสิ้นเชิงและตรงกันข้ามกับ JavaScript ที่ไม่สร้างความรำคาญซึ่งเราได้เขียนมาตลอด 10 ปีที่ผ่านมา สิ่งนี้อาจทำให้เกิดความคุ้นเคย
หากสิ่งนี้ฟังดูเหมือนว่าเกินความจริงและมีข้อ จำกัด ไม่มีอะไรที่จะไกลไปกว่าความจริง เนื่องจาก AngularJS ใช้ HTML ของคุณเป็นรหัสคุณจะได้รับระดับ HTML ในเว็บแอปพลิเคชันของคุณ ทุกอย่างเป็นไปได้และสิ่งต่าง ๆ ส่วนใหญ่จะง่ายอย่างน่าประหลาดใจเมื่อคุณทำการกระโดดความคิดไม่กี่
ลงไปที่ nitty gritty กันดีกว่า
อันดับแรก Angular ไม่ได้แทนที่ jQuery
เชิงมุมและ jQuery ทำสิ่งต่าง ๆ AngularJS ให้ชุดเครื่องมือในการสร้างเว็บแอปพลิเคชัน jQuery ให้เครื่องมือในการปรับเปลี่ยน DOM เป็นหลัก หากมี jQuery อยู่ในหน้าของคุณ AngularJS จะใช้มันโดยอัตโนมัติ ถ้าไม่ใช่นั่นก็คือ AngularJS มาพร้อมกับ jQuery Lite ซึ่งเป็นเวอร์ชั่นที่ถูกตัดทอนลง
Misko ชอบ jQuery และไม่คัดค้านการใช้งาน อย่างไรก็ตามคุณจะพบว่าคุณสามารถทำงานให้เสร็จได้โดยใช้การผสมผสานของขอบเขตเทมเพลตและคำสั่งและคุณควรเลือกเวิร์กโฟลว์นี้หากเป็นไปได้เนื่องจากรหัสของคุณจะแยกกันมากขึ้นกำหนดค่าได้มากขึ้นและมากขึ้น เชิงมุม.
หากคุณใช้ jQuery คุณไม่ควรโรยทั่วสถานที่ ตำแหน่งที่ถูกต้องสำหรับการจัดการ DOM ใน AngularJS อยู่ในคำสั่ง เพิ่มเติมเกี่ยวกับสิ่งเหล่านี้ในภายหลัง
JavaScript ไม่สร้างความรำคาญกับ Selectors vs. Temlarative Templates
โดยทั่วไปแล้ว jQuery จะถูกใช้งานอย่างสงบเสงี่ยม รหัส JavaScript ของคุณมีการเชื่อมโยงในส่วนหัว (หรือส่วนท้าย) และนี่เป็นที่เดียวเท่านั้นที่มีการกล่าวถึง เราใช้ตัวเลือกเพื่อเลือกบิตของหน้าและเขียนปลั๊กอินเพื่อแก้ไขส่วนเหล่านั้น
JavaScript อยู่ในการควบคุม HTML นั้นมีความเป็นอิสระอย่างสมบูรณ์ HTML ของคุณยังคงความหมายแม้ไม่มี JavaScript แอตทริบิวต์ Onclick เป็นวิธีปฏิบัติที่ไม่ดีมาก
หนึ่งในสิ่งแรกที่คุณจะสังเกตเห็นเกี่ยวกับ AngularJS คือแอตทริบิวต์ที่กำหนดเองนั้นมีอยู่ทั่วไปแอตทริบิวต์ที่กำหนดเองได้ทุกที่HTML ของคุณจะเกลื่อนไปด้วยแอตทริบิวต์ ng ซึ่งเป็นคุณลักษณะ onClick บนเตียรอยด์เป็นหลัก นี่เป็นคำสั่ง (คอมไพเลอร์คำสั่ง) และเป็นหนึ่งในวิธีหลักที่เทมเพลตจะถูกเชื่อมโยงกับโมเดล
เมื่อคุณเห็นสิ่งนี้เป็นครั้งแรกคุณอาจถูกไล่ออกให้เขียน AngularJS เป็นจาวาสคริปต์ที่ล่วงล้ำมาจากโรงเรียนเก่า (อย่างที่ฉันเคยทำในตอนแรก) อันที่จริง AngularJS ไม่ได้เล่นตามกฎเหล่านั้น ใน AngularJS HTML5 ของคุณเป็นเทมเพลต มันถูกรวบรวมโดย AngularJS เพื่อผลิตหน้าเว็บของคุณ
นี่คือความแตกต่างครั้งใหญ่ครั้งแรก หากต้องการ jQuery หน้าเว็บของคุณคือ DOM ที่ต้องจัดการ สำหรับ AngularJS HTML ของคุณคือรหัสที่จะรวบรวม AngularJS อ่านในหน้าเว็บทั้งหมดของคุณและรวบรวมเป็นหน้าเว็บใหม่โดยใช้คอมไพเลอร์ในตัว
แม่แบบของคุณควรเปิดเผย ความหมายของมันควรจะชัดเจนเพียงแค่อ่าน เราใช้แอตทริบิวต์ที่กำหนดเองพร้อมชื่อที่มีความหมาย เราสร้างองค์ประกอบ HTML ใหม่อีกครั้งด้วยชื่อที่มีความหมาย นักออกแบบที่มีความรู้ HTML น้อยที่สุดและไม่มีทักษะการเขียนโค้ดสามารถอ่านเทมเพลต AngularJS ของคุณและเข้าใจสิ่งที่กำลังทำอยู่ เขาหรือเธอสามารถทำการปรับเปลี่ยน นี่คือวิธีเชิงมุม
แม่แบบอยู่ในที่นั่งคนขับ
หนึ่งในคำถามแรกที่ฉันถามตัวเองเมื่อเริ่มต้น AngularJS และทำงานผ่านบทช่วยสอนคือ"รหัสของฉันอยู่ที่ไหน" . ฉันไม่ได้เขียน JavaScript แต่ยังมีพฤติกรรมทั้งหมดนี้ คำตอบนั้นชัดเจน เนื่องจาก AngularJS รวบรวม DOM AngularJS จึงใช้ HTML ของคุณเป็นรหัส สำหรับกรณีง่าย ๆ หลายครั้งมันก็เพียงพอแล้วที่จะเพียงแค่เขียนเทมเพลตและให้ AngularJS รวบรวมมันเป็นแอพพลิเคชั่นสำหรับคุณ
เทมเพลตของคุณขับเคลื่อนแอปพลิเคชันของคุณ มันถือว่าเป็นDSL คุณเขียนส่วนประกอบ AngularJS และ AngularJS จะดูแลการดึงและทำให้พร้อมใช้งานในเวลาที่เหมาะสมตามโครงสร้างของแม่แบบของคุณ สิ่งนี้แตกต่างอย่างมากกับรูปแบบMVCมาตรฐานซึ่งเทมเพลตใช้สำหรับส่งออกเท่านั้น
มันคล้ายกับXSLTมากกว่าRuby on Railsมากกว่า
นี่เป็นสิ่งที่ตรงกันข้ามกับการควบคุมอย่างสิ้นเชิง
หยุดพยายามผลักดันแอปพลิเคชันของคุณจาก JavaScript ให้เทมเพลตขับเคลื่อนแอปพลิเคชันและให้ AngularJS ดูแลการเดินสายส่วนประกอบด้วยกัน นี่ก็เป็นวิธีเชิงมุม
Semantic HTML vs. Semantic Models
ด้วย jQuery หน้า HTML ของคุณควรมีเนื้อหาที่สื่อความหมาย หากปิด JavaScript (โดยผู้ใช้หรือเครื่องมือค้นหา) เนื้อหาของคุณยังคงสามารถเข้าถึงได้
เพราะ AngularJS ใช้หน้า HTML ของคุณเป็นเทมเพลต เทมเพลตไม่ควรมีความหมายเนื่องจากเนื้อหาของคุณจะถูกจัดเก็บในแบบจำลองของคุณซึ่งท้ายที่สุดแล้วมาจาก API ของคุณ AngularJS คอมไพล์ DOM ของคุณด้วยรูปแบบการสร้างเว็บเพจแบบ semantic
แหล่งที่มา HTML ของคุณไม่มีความหมายอีกต่อไปแทน API และ DOM ที่คอมไพล์แล้วของคุณนั้นมีความหมาย
ใน AngularJS ความหมายมีชีวิตอยู่ในรูปแบบ HTML เป็นเพียงแม่แบบสำหรับแสดงเท่านั้น
ณ จุดนี้คุณอาจมีคำถามทุกข้อเกี่ยวกับSEOและการเข้าถึงและถูกต้อง มีปัญหาเปิดอยู่ที่นี่ โปรแกรมอ่านหน้าจอส่วนใหญ่จะแยกวิเคราะห์ JavaScript ในขณะนี้ เครื่องมือค้นหาสามารถทำดัชนีเนื้อหาAJAXed อย่างไรก็ตามคุณจะต้องแน่ใจว่าคุณใช้ pushstate URL และคุณมีแผนผังไซต์ที่ดี ดูที่นี่สำหรับการสนทนาของปัญหา: https://stackoverflow.com/a/23245379/687677
การแยกข้อกังวล (SOC) กับ MVC
การแยกข้อกังวล (SOC) เป็นรูปแบบที่เติบโตมานานหลายปีในการพัฒนาเว็บไซต์ด้วยเหตุผลหลายประการรวมถึง SEO การเข้าถึงและการเข้ากันไม่ได้ของเบราว์เซอร์ ดูเหมือนว่านี้:
- HTML - ความหมายความหมาย HTML ควรยืนอยู่คนเดียว
- CSS - ใส่สไตล์โดยไม่มี CSS หน้ายังสามารถอ่านได้
- JavaScript - พฤติกรรมโดยไม่มีสคริปต์เนื้อหาจะยังคงอยู่
อีกครั้ง AngularJS ไม่เล่นตามกฎ ในจังหวะ, AngularJS ทำไปกับทศวรรษของภูมิปัญญาที่ได้รับและใช้รูปแบบ MVC ซึ่งแม่แบบไม่ได้มีความหมายอีกต่อไปไม่แม้แต่น้อย
ดูเหมือนว่านี้:
- รุ่น - โมเดลของคุณมีข้อมูลความหมายของคุณ แบบจำลองมักเป็นวัตถุJSON โมเดลมีอยู่เป็นคุณลักษณะของวัตถุที่เรียกว่า $ scope นอกจากนี้คุณยังสามารถจัดเก็บฟังก์ชั่นยูทิลิตี้ที่มีประโยชน์ใน $ scope ซึ่งแม่แบบของคุณสามารถเข้าถึงได้
- มุมมอง - มุมมองของคุณเขียนด้วย HTML มุมมองมักไม่ได้มีความหมายเพราะข้อมูลของคุณอาศัยอยู่ในรูปแบบ
- คอนโทรลเลอร์ - คอนโทรลเลอร์ของคุณเป็นฟังก์ชัน JavaScript ซึ่งเชื่อมต่อมุมมองกับโมเดล ฟังก์ชั่นของมันคือการเริ่มต้น $ scope ขึ้นอยู่กับแอปพลิเคชันของคุณคุณอาจหรืออาจไม่จำเป็นต้องสร้างคอนโทรลเลอร์ คุณสามารถควบคุมได้หลายหน้า
MVC และ SOC ไม่ได้อยู่ฝั่งตรงข้ามของระดับเดียวกัน แต่อยู่ในแกนที่แตกต่างอย่างสิ้นเชิง SOC ไม่สมเหตุสมผลในบริบท AngularJS คุณต้องลืมมันและไปต่อ
ถ้าอย่างคุณฉันอาศัยอยู่ในสงครามเบราว์เซอร์คุณอาจพบว่าความคิดนี้ค่อนข้างน่ารังเกียจ รับไปมันจะคุ้มค่าฉันสัญญา
ปลั๊กอินกับคำสั่ง
ปลั๊กอินขยาย jQuery AngularJS Directives ขยายขีดความสามารถของเบราว์เซอร์ของคุณ
ใน jQuery เรากำหนดปลั๊กอินโดยการเพิ่มฟังก์ชั่นใน jQuery.prototype จากนั้นเราเชื่อมโยงสิ่งเหล่านี้ลงใน DOM โดยเลือกองค์ประกอบและเรียกใช้ปลั๊กอินกับผลลัพธ์ แนวคิดคือการขยายขีดความสามารถของ jQuery
ตัวอย่างเช่นหากคุณต้องการภาพหมุนบนหน้าของคุณคุณอาจกำหนดรายการตัวเลขที่ไม่เรียงลำดับซึ่งอาจถูกห่อด้วยองค์ประกอบการนำทาง จากนั้นคุณอาจเขียน jQuery เพื่อเลือกรายการในหน้านั้นและพักเป็นแกลเลอรี่ที่มีเวลาในการทำแอนิเมชั่นเลื่อน
ใน AngularJS เรากำหนดคำสั่ง คำสั่งเป็นฟังก์ชั่นที่ส่งกลับวัตถุ JSON วัตถุนี้จะบอก AngularJS ว่าองค์ประกอบ DOM ใดที่ควรมองหาและการเปลี่ยนแปลงที่ทำกับพวกมัน คำสั่งถูกเชื่อมต่อกับเทมเพลตโดยใช้แอตทริบิวต์หรือองค์ประกอบที่คุณประดิษฐ์ แนวคิดคือการขยายขีดความสามารถของ HTML ด้วยคุณลักษณะและองค์ประกอบใหม่
วิธี AngularJS คือการขยายขีดความสามารถของ HTML ที่เป็นภาษาพื้นเมือง คุณควรเขียน HTML ที่ดูเหมือน HTML ขยายด้วยแอตทริบิวต์ที่กำหนดเองและองค์ประกอบ
หากคุณต้องการม้าหมุนให้ใช้<carousel />
องค์ประกอบแล้วกำหนดคำสั่งเพื่อดึงแม่แบบและทำให้เครื่องดูดนั้นทำงานได้
คำสั่งขนาดเล็กจำนวนมากเทียบกับปลั๊กอินขนาดใหญ่ที่มีสวิตช์การกำหนดค่า
แนวโน้มกับ jQuery คือการเขียนปลั๊กอินขนาดใหญ่ที่ยอดเยี่ยมอย่างไลท์บ็อกซ์ซึ่งเรากำหนดค่าโดยผ่านค่าและตัวเลือกมากมาย
นี่เป็นข้อผิดพลาดใน AngularJS
นำตัวอย่างของการเลื่อนลง เมื่อเขียนปลั๊กอินแบบหล่นลงคุณอาจถูกล่อลวงให้ใส่โค้ดในตัวจัดการการคลิกบางทีอาจเป็นฟังก์ชั่นเพื่อเพิ่มบั้งซึ่งอาจเป็นขึ้นหรือลงอาจเปลี่ยนคลาสขององค์ประกอบที่กางออกแสดงเมนูซ่อนสิ่งที่เป็นประโยชน์ทั้งหมด
จนกว่าคุณจะต้องการเปลี่ยนแปลงเล็กน้อย
สมมติว่าคุณมีเมนูที่คุณต้องการเปิดขึ้นเมื่อวางเมาส์เหนือ ทีนี้เรามีปัญหา ปลั๊กอินของเรามีสายในตัวจัดการการคลิกของเราสำหรับเราเราจะต้องเพิ่มตัวเลือกการกำหนดค่าเพื่อให้มันทำงานแตกต่างกันในกรณีเฉพาะนี้
ใน AngularJS เราเขียนคำสั่งที่เล็กลง คำสั่งแบบเลื่อนลงของเราจะมีขนาดเล็กอย่างน่าขัน มันอาจรักษาสถานะ folded และจัดเตรียมวิธีในการ fold (), unfold () หรือ toggle () วิธีการเหล่านี้จะอัปเดต $ scope.menu.visible ซึ่งเป็นบูลีนที่ถือสถานะ
ตอนนี้ในเทมเพลตของเราเราสามารถโยงเรื่องนี้ได้:
<a ng-click="toggle()">Menu</a>
<ul ng-show="menu.visible">
...
</ul>
ต้องการอัปเดตเมื่อวางเมาส์หรือไม่
<a ng-mouseenter="unfold()" ng-mouseleave="fold()">Menu</a>
<ul ng-show="menu.visible">
...
</ul>
เทมเพลตขับเคลื่อนแอปพลิเคชันเพื่อให้เราได้รับข้อมูลระดับ HTML อย่างละเอียด ถ้าเราต้องการแยกเป็นกรณี ๆ ไปเท็มเพลตทำให้ง่ายขึ้น
ปิดและขอบเขต $
ปลั๊กอิน JQuery ถูกสร้างขึ้นในการปิด ความเป็นส่วนตัวยังคงอยู่ภายในการปิดที่ มันขึ้นอยู่กับคุณที่จะรักษาห่วงโซ่ขอบเขตของคุณไว้ในการปิดนั้น คุณสามารถเข้าถึงชุดของโหนด DOM เท่านั้นที่ส่งผ่านไปยังปลั๊กอินโดย jQuery รวมถึงตัวแปรท้องถิ่นใด ๆ ที่กำหนดในการปิดและรูปกลมใด ๆ ที่คุณกำหนดไว้ ซึ่งหมายความว่าปลั๊กอินมีอยู่ในตัวเอง นี่เป็นสิ่งที่ดี แต่สามารถ จำกัด ได้เมื่อสร้างแอปพลิเคชันทั้งหมด การพยายามส่งผ่านข้อมูลระหว่างส่วนต่างๆของหน้าแบบไดนามิกกลายเป็นเรื่องน่าเบื่อ
AngularJS มี $ ขอบเขตวัตถุ เหล่านี้เป็นวัตถุพิเศษที่สร้างและดูแลโดย AngularJS ซึ่งคุณจัดเก็บแบบจำลองของคุณ คำสั่งบางอย่างจะวางไข่ $ ขอบเขตใหม่ซึ่งโดยค่าเริ่มต้นสืบทอดมาจากการห่อ $ scope โดยใช้การสืบทอด JavaScript ต้นแบบ วัตถุ $ scope สามารถเข้าถึงได้ในตัวควบคุมและมุมมอง
นี่คือส่วนที่ฉลาด เนื่องจากโครงสร้างของการสืบทอดขอบเขต $ เป็นไปตามโครงสร้างของ DOM องค์ประกอบจึงสามารถเข้าถึงขอบเขตของตนเองและขอบเขตใด ๆ ที่มีอยู่ได้อย่างราบรื่นจนถึงขอบเขต $ global (ซึ่งไม่เหมือนกับขอบเขตทั่วโลก)
สิ่งนี้ทำให้การส่งผ่านข้อมูลง่ายขึ้นและจัดเก็บข้อมูลในระดับที่เหมาะสม หากมีการเปิดตัวแบบเลื่อนลงขอบเขต $ แบบเลื่อนลงเท่านั้นที่จำเป็นต้องรู้ หากผู้ใช้อัปเดตการตั้งค่าของพวกเขาคุณอาจต้องการอัปเดตขอบเขต $ ทั่วโลกและขอบเขตที่ซ้อนกันใด ๆ ที่ฟังการตั้งค่าผู้ใช้จะได้รับการแจ้งเตือนโดยอัตโนมัติ
นี่อาจฟังดูซับซ้อนเมื่อคุณผ่อนคลายมันก็เหมือนกับการบิน คุณไม่จำเป็นต้องสร้างออบเจค $ scope AngularJS อินสแตนซ์และกำหนดค่าให้คุณอย่างถูกต้องและเหมาะสมตามลำดับชั้นของเทมเพลตของคุณ AngularJS ทำให้องค์ประกอบของคุณพร้อมใช้งานโดยใช้เวทย์มนตร์ของการพึ่งพาการฉีด (เพิ่มเติมในภายหลัง)
การเปลี่ยนแปลง DOM ด้วยตนเองกับการผูกข้อมูล
ใน jQuery คุณทำการเปลี่ยนแปลง DOM ทั้งหมดด้วยมือ คุณสร้างองค์ประกอบ DOM ใหม่โดยทางโปรแกรม หากคุณมีอาร์เรย์ JSON และคุณต้องการนำไปไว้ใน DOM คุณต้องเขียนฟังก์ชันเพื่อสร้าง HTML และแทรก
ใน AngularJS คุณสามารถทำได้เช่นกัน แต่คุณควรใช้ข้อมูลที่มีผลผูกพัน เปลี่ยนโมเดลของคุณและเนื่องจาก DOM ถูกผูกไว้ผ่านเทมเพลต DOM ของคุณจะอัปเดตโดยอัตโนมัติจึงไม่จำเป็นต้องมีการแทรกแซง
เนื่องจากการผูกข้อมูลจะกระทำจากเทมเพลตโดยใช้แอททริบิวต์หรือซินโครไนซ์ปีกกาจึงทำได้ง่ายมาก มีค่าโสหุ้ยเล็กน้อยที่เกี่ยวข้องกับมันดังนั้นคุณจะพบว่าตัวเองทำอยู่ตลอดเวลา
<input ng-model="user.name" />
$scope.user.name
ผูกองค์ประกอบการป้อนข้อมูลเพื่อ การอัปเดตอินพุตจะอัปเดตค่าในขอบเขตปัจจุบันของคุณและในทางกลับกัน
ในทำนองเดียวกัน:
<p>
{{user.name}}
</p>
จะเอาท์พุทชื่อผู้ใช้ในวรรค มันมีผลผูกพันสดดังนั้นหาก$scope.user.name
มีการอัปเดตค่าแม่แบบจะอัปเดตด้วย
อาแจ็กซ์ตลอดเวลา
ใน jQuery การโทร Ajax นั้นค่อนข้างง่าย แต่ก็ยังมีบางสิ่งที่คุณอาจคิดสองครั้ง มีความซับซ้อนเพิ่มขึ้นให้คิดและเป็นชิ้นของสคริปต์เพื่อรักษา
ใน AngularJS Ajax เป็นโซลูชัน go-to เริ่มต้นของคุณและเกิดขึ้นตลอดเวลาเกือบจะไม่มีคุณสังเกตเห็น คุณสามารถรวมเทมเพลตที่มี ng-include ได้ คุณสามารถใช้เทมเพลตด้วยคำสั่งที่กำหนดเองง่ายที่สุด คุณสามารถตัดการโทร Ajax ในบริการและสร้างบริการGitHubหรือบริการFlickrซึ่งคุณสามารถเข้าถึงได้อย่างง่ายดายอย่างน่าอัศจรรย์
บริการวัตถุ vs ฟังก์ชั่นผู้ช่วย
ใน jQuery หากเราต้องการทำงานที่ไม่เกี่ยวข้องกับงานเล็กเช่นดึงฟีดจาก API เราอาจเขียนฟังก์ชั่นเล็ก ๆ น้อย ๆ เพื่อทำเช่นนั้นในตอนท้าย นั่นเป็นคำตอบที่ถูกต้อง แต่ถ้าเราต้องการเข้าถึงฟีดนั้นบ่อยๆ ถ้าเราต้องการนำรหัสนั้นกลับมาใช้ใหม่ในแอปพลิเคชันอื่น
AngularJS ให้บริการวัตถุแก่เรา
บริการเป็นวัตถุอย่างง่ายที่มีฟังก์ชั่นและข้อมูล พวกเขามักจะเป็นซิงเกิลตันซึ่งหมายความว่าจะไม่มีใครมากกว่าหนึ่งคน สมมติว่าเราต้องการเข้าถึง Stack Overflow API เราอาจเขียนวิธีการStackOverflowService
ที่กำหนด
สมมติว่าเรามีตะกร้าสินค้า เราอาจกำหนด ShoppingCartService ซึ่งดูแลรถเข็นของเราและมีวิธีการเพิ่มและลบรายการ เนื่องจากบริการเป็นแบบซิงเกิลและใช้งานร่วมกันโดยส่วนประกอบอื่น ๆ วัตถุใด ๆ ที่จำเป็นต้องสามารถเขียนไปยังตะกร้าสินค้าและดึงข้อมูลจากมัน มันเป็นรถเข็นเดียวกันเสมอ
วัตถุบริการเป็นส่วนประกอบ AngularJS ที่มีอยู่ในตัวเองซึ่งเราสามารถใช้และนำกลับมาใช้ใหม่ได้ตามที่เราเห็นว่าเหมาะสม พวกเขาเป็นวัตถุ JSON ง่าย ๆ ที่มีฟังก์ชั่นและข้อมูล พวกเขามักจะเป็นซิงเกิลดังนั้นหากคุณเก็บข้อมูลไว้ในบริการในที่เดียวคุณสามารถรับข้อมูลนั้นได้จากที่อื่นเพียงแค่ขอใช้บริการเดียวกัน
การพึ่งพาการฉีด (DI) กับการติดตั้ง - aka-spaghettification
AngularJS จัดการการอ้างอิงของคุณสำหรับคุณ หากคุณต้องการวัตถุเพียงอ้างถึงแล้ว AngularJS จะรับมันให้คุณ
จนกว่าคุณจะเริ่มใช้สิ่งนี้มันก็ยากที่จะอธิบายว่านี่เป็นเรื่องใหญ่ขนาดไหน ไม่มีอะไรที่เหมือนกับ AngularJS DI อยู่ใน jQuery
DI หมายความว่าแทนที่จะเขียนแอปพลิเคชันของคุณและเชื่อมโยงเข้าด้วยกันคุณจะต้องกำหนดไลบรารีของส่วนประกอบแต่ละอันที่ระบุด้วยสตริง
ว่าฉันมีองค์ประกอบที่เรียกว่า 'FlickrService' ซึ่งกำหนดวิธีการดึงฟีด JSON จาก Flickr ตอนนี้ถ้าฉันต้องการเขียนคอนโทรลเลอร์ที่สามารถเข้าถึง Flickr ได้ฉันต้องอ้างถึง 'FlickrService' ตามชื่อเมื่อฉันประกาศคอนโทรลเลอร์ AngularJS จะดูแล instantiating ส่วนประกอบและทำให้มันพร้อมใช้งานสำหรับคอนโทรลเลอร์ของฉัน
ตัวอย่างเช่นที่นี่ฉันกำหนดบริการ:
myApp.service('FlickrService', function() {
return {
getFeed: function() { // do something here }
}
});
ตอนนี้เมื่อฉันต้องการใช้บริการนั้นฉันเพียงแค่อ้างอิงโดยใช้ชื่อดังนี้:
myApp.controller('myController', ['FlickrService', function(FlickrService) {
FlickrService.getFeed()
}]);
AngularJS จะรับรู้ว่าจำเป็นต้องมีวัตถุ FlickrService ในการสร้างอินสแตนซ์ของคอนโทรลเลอร์และจะให้สิ่งหนึ่งกับเรา
สิ่งนี้ทำให้การเดินสายเข้าด้วยกันเป็นเรื่องง่ายมากและจะช่วยลดแนวโน้มที่จะเกิด spagettification เรามีรายการองค์ประกอบที่เรียบง่ายและ AngularJS มอบให้พวกเราทีละคนเมื่อเราต้องการ
สถาปัตยกรรมบริการแบบแยกส่วน
jQuery พูดน้อยมากเกี่ยวกับวิธีที่คุณควรจัดระเบียบรหัสของคุณ AngularJS มีความคิดเห็น
AngularJS ให้โมดูลแก่คุณซึ่งคุณสามารถวางรหัสของคุณได้ หากคุณกำลังเขียนสคริปต์ที่พูดถึง Flickr คุณอาจต้องการสร้างโมดูล Flickr เพื่อรวมฟังก์ชัน Flickr ที่เกี่ยวข้องทั้งหมดเข้าด้วยกันโมดูลสามารถรวมโมดูลอื่น ๆ (DI) แอปพลิเคชันหลักของคุณมักจะเป็นโมดูลและควรรวมโมดูลอื่นทั้งหมดที่แอปพลิเคชันของคุณจะขึ้นอยู่กับ
คุณจะได้รับการนำรหัสมาใช้อย่างง่ายหากคุณต้องการเขียนแอปพลิเคชั่นอื่นตาม Flickr คุณสามารถรวมโมดูล Flickr และ voila ได้คุณสามารถเข้าถึงฟังก์ชั่นที่เกี่ยวข้องกับ Flickr ทั้งหมดในแอปพลิเคชันใหม่ของคุณ
โมดูลประกอบด้วยส่วนประกอบ AngularJS เมื่อเรารวมถึงโมดูลส่วนประกอบทั้งหมดที่อยู่ในโมดูลที่กลายเป็นใช้ได้ให้เราเป็นรายการที่เรียบง่ายระบุสายที่ไม่ซ้ำกันของพวกเขา จากนั้นเราสามารถฉีดส่วนประกอบเหล่านั้นเข้าด้วยกันโดยใช้กลไกการฉีดของ AngularJS
เพื่อสรุป
AngularJS และ jQuery ไม่ใช่ศัตรู เป็นไปได้ที่จะใช้ jQuery ภายใน AngularJS อย่างมาก หากคุณกำลังใช้ AngularJS ดี (แม่แบบการผูกข้อมูล, $ ขอบเขตคำสั่งอื่น ๆ ) คุณจะพบว่าคุณจะต้องมีจำนวนมากน้อย jQuery กว่าที่คุณมิฉะนั้นอาจต้อง
สิ่งสำคัญที่ต้องตระหนักคือแม่แบบของคุณขับเคลื่อนแอปพลิเคชันของคุณ หยุดพยายามเขียนปลั๊กอินขนาดใหญ่ที่ทำทุกอย่าง แทนที่จะเขียนคำสั่งเล็ก ๆ น้อย ๆ ที่ทำสิ่งหนึ่งแล้วเขียนเทมเพลตอย่างง่าย ๆ เพื่อโยงเข้าด้วยกัน
คิดถึง JavaScript ที่ไม่สร้างความรำคาญให้น้อยลงและลองคิดในแง่ของส่วนขยาย HTML แทน
หนังสือเล่มเล็ก ๆ ของฉัน
ผมตื่นเต้นมากเกี่ยวกับ AngularJS ผมเขียนหนังสือสั้น ๆ เกี่ยวกับมันที่คุณยินดีต้อนรับมากที่จะอ่านออนไลน์http://nicholasjohnson.com/angular-book/ ฉันหวังว่ามันจะเป็นประโยชน์