อะไรคือความแตกต่างระหว่างบริการคำสั่งและโมดูล?


151

ฉันอ่านเอกสารจำนวนมากและฉันสับสนมากขึ้นเรื่อย ๆ โดยทั่วไปฉันไม่สามารถเข้าใจความแตกต่างระหว่าง

  • บริการ
  • คำสั่ง
  • โมดูล

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

คำตอบ:


123

คิดว่าโมดูลเป็นสถานที่ในการเชื่อมโยงหลาย ๆ อย่างเช่นคำสั่งบริการค่าคงที่เป็นต้นโมดูลสามารถถูกฉีดเข้าไปในโมดูลอื่นเพื่อให้คุณสามารถนำกลับมาใช้ใหม่ได้ในระดับสูง

เมื่อเขียนแอพเชิงมุมคุณจะมีโมดูลระดับบนสุดซึ่งเป็นรหัสแอปพลิเคชันของคุณ (ไม่มีเทมเพลต)

บริการส่วนใหญ่เป็นวิธีการสื่อสารระหว่างตัวควบคุม แต่คุณสามารถฉีดบริการหนึ่งเข้าไปในอีกบริการหนึ่งได้ บริการมักใช้เป็นวิธีในการเข้าถึงที่เก็บข้อมูลของคุณและผู้คนจะล้อม API เชิงมุมเช่น ngResource เทคนิคนี้มีประโยชน์เนื่องจากทำให้การทดสอบ (โดยเฉพาะการเยาะเย้ย) ค่อนข้างง่าย คุณสามารถมีบริการสำหรับทำสิ่งต่าง ๆ เช่นการรับรองความถูกต้องการบันทึกเป็นต้น

คำสั่งใช้สำหรับการสร้างวิดเจ็ตหรือห่อสิ่งที่มีอยู่เช่นปลั๊กอิน jquery การห่อปลั๊กอินที่มีอยู่อาจเป็นสิ่งที่ท้าทายและเหตุผลที่คุณต้องทำคือการสร้างการเชื่อมโยงข้อมูลแบบสองทางระหว่างปลั๊กอินและเชิงมุม หากคุณไม่ต้องการการผูกข้อมูลแบบสองทางคุณไม่จำเป็นต้องปิดมัน

คำสั่งยังเป็นสถานที่สำหรับการจัดการ DOM การจับเหตุการณ์ DOM ฯลฯ คุณไม่ควรทำสิ่งที่เกี่ยวข้องกับ DOM ในตัวควบคุมหรือบริการ การสร้างคำสั่งอาจทำให้เกิดความซับซ้อนได้ IMHO ฉันขอแนะนำให้ดู API เป็นครั้งแรกสำหรับสิ่งที่สามารถทำสิ่งที่คุณกำลังมองหาหรือขอคำแนะนำจากกลุ่ม Google ของ Angular


234

จากบันทึกย่อส่วนตัวของฉัน(ส่วนใหญ่เป็นตัวอย่างจากเอกสาร, โพสต์ของกลุ่ม Google และโพสต์ SO):

โมดูล

  • จัดเตรียมวิธีในการบริการเนมสเปซ / กลุ่มคำสั่งตัวกรองข้อมูลการกำหนดค่าและรหัสการเริ่มต้น
  • ช่วยหลีกเลี่ยงตัวแปรส่วนกลาง
  • ถูกใช้เพื่อกำหนดค่า $ injector อนุญาตให้สิ่งต่าง ๆ ที่กำหนดโดยโมดูล (หรือโมดูลทั้งหมดเอง) ที่จะฉีดที่อื่น (สิ่งที่พึ่งพาการฉีด)
  • โมดูลเชิงมุมไม่เกี่ยวข้องกับ CommonJS หรือ Require.js ตรงข้ามกับโมดูล AMD หรือ Require.js โมดูลเชิงมุมไม่พยายามที่จะแก้ปัญหาของการสั่งโหลดสคริปต์หรือการดึงสคริปต์ที่ขี้เกียจ เป้าหมายเหล่านี้เป็นมุมฉากและทั้งสองโมดูลสามารถอยู่เคียงข้างกันและบรรลุเป้าหมาย (ดังนั้นเอกสารเรียกร้อง)

บริการ

  • เป็น singletons ดังนั้นมีเพียงหนึ่งอินสแตนซ์ของแต่ละบริการที่คุณกำหนด ในฐานะที่เป็นซิงเกิลตันพวกเขาจะไม่ได้รับผลกระทบจากขอบเขตและสามารถเข้าถึงได้โดย (แชร์กับ) หลายมุมมอง / ตัวควบคุม / คำสั่ง / บริการอื่น ๆ
  • คุณสามารถ (และอาจจะควร) สร้างบริการที่กำหนดเองเมื่อ
    • อย่างน้อยสองสิ่งต้องการการเข้าถึงข้อมูลเดียวกัน (ไม่ใช้ขอบเขตรูท) หรือคุณเพียงแค่ต้องการแค็ปซูลข้อมูลของคุณให้เรียบร้อย
    • คุณต้องการสรุปการโต้ตอบกับพูดเว็บเซิร์ฟเวอร์ (ขยายทรัพยากร $ หรือ $ http ในบริการของคุณ)
  • บริการในตัวเริ่มต้นด้วย '$'
  • ในการใช้บริการจำเป็นต้องมีการฉีดขึ้นอยู่กับการพึ่งพา (เช่นบนตัวควบคุมหรือบริการอื่นหรือคำสั่ง)

คำสั่ง (บางรายการด้านล่างบอกว่าเป็นสิ่งเดียวกัน แต่ฉันพบว่าบางครั้งถ้อยคำที่แตกต่างกันเล็กน้อยช่วยได้มาก)

  • มีความรับผิดชอบในการปรับปรุง DOM เมื่อสถานะของรูปแบบการเปลี่ยนแปลง
  • ขยายคำศัพท์ HTML = สอนเทคนิคใหม่ ๆ ของ HTML
    Angular มาพร้อมกับชุดคำสั่งในตัว (เช่น ng- * stuff) ซึ่งมีประโยชน์สำหรับการสร้างเว็บแอปพลิเคชัน แต่คุณสามารถเพิ่มของคุณเองเพื่อให้ HTML สามารถเปลี่ยนเป็น Domain Specific Language (DSL) ที่เปิดเผยได้ เช่นองค์ประกอบ <tabs> และ <pane> ในการสาธิตหน้าแรกของ Angular "การสร้างส่วนประกอบ"
    • คำสั่งในตัวไม่ชัดเจน (เพราะไม่ได้ขึ้นต้นด้วย "ng"): a, form, input, script, select, textarea ภายใต้เชิงมุมสิ่งเหล่านี้ทำมากกว่าปกติ!
  • คำสั่งอนุญาตให้คุณ "componentize HTML" คำสั่งมักจะดีกว่ารวม ng ตัวอย่างเช่นเมื่อคุณเริ่มเขียน HTML จำนวนมากที่มีผลผูกพันกับข้อมูลเป็นหลักให้ทำการ refactor ที่ HTML นั้นเป็นคำสั่ง (ใช้ซ้ำได้)
  • คอมไพเลอร์ Angular ช่วยให้คุณสามารถแนบการทำงานกับองค์ประกอบ HTML หรือคุณลักษณะใด ๆ และยังสร้างองค์ประกอบ HTML หรือแอตทริบิวต์ใหม่ที่มีพฤติกรรมที่กำหนดเอง โทรเชิงมุมนามสกุลพฤติกรรมเหล่านี้สั่ง
    • เมื่อคุณต้มทุกอย่างลงไปคำสั่งเป็นเพียงฟังก์ชั่นที่ทำงานเมื่อคอมไพเลอร์ Angular พบมันใน DOM
  • คำสั่งเป็นพฤติกรรมหรือการแปลง DOM ซึ่งถูกทริกเกอร์โดยการปรากฏตัวของคุณลักษณะชื่อองค์ประกอบชื่อชั้นหรือชื่อในความคิดเห็น Directive เป็นพฤติกรรมที่ควรถูกเรียกใช้เมื่อพบการสร้าง HTML เฉพาะในกระบวนการรวบรวม (HTML) คำสั่งสามารถวางในชื่อองค์ประกอบคุณลักษณะชื่อชั้นเช่นเดียวกับความคิดเห็น
    • คำสั่งส่วนใหญ่ถูก จำกัด ให้ใช้กับแอตทริบิวต์เท่านั้น เช่น DoubleClick ใช้คำสั่งแอตทริบิวต์ที่กำหนดเองเท่านั้น
  • ดูเพิ่มเติมคำสั่ง angularjs คืออะไร?

กำหนดและจัดกลุ่มสิ่งของเชิงมุม (สิ่งที่ต้องพึ่งพาการฉีด) ในโมดูล
แบ่งปันข้อมูลและสรุปการโต้ตอบของเว็บเซิร์ฟเวอร์ในบริการ
ขยาย HTML และทำการจัดการ DOM ในคำสั่ง
และทำให้ตัวควบคุมเป็น "ผอม" ที่สุด


1
@ Mark Rajcok - คำตอบที่ดีฉันให้ +1 คุณแล้ว แต่มันจะดีมากที่จะอธิบายรายการเพิ่มเติม 3 ภายใต้ Modules เช่น "กำหนดค่า $ injector" ผู้คนเข้าใจบริการแบบฉีด แต่สิ่งนี้เกี่ยวข้องกับโมดูลอย่างไร
whitneyland

2
@LeeWhitney โปรดดูdocs.angularjs.org/guide/module#dependencies : "โมดูลสามารถแสดงรายการโมดูลอื่น ๆ เป็นการอ้างอิงของพวกเขาทั้งนี้ขึ้นอยู่กับโมดูลหมายถึงโมดูลที่จำเป็นต้องโหลดก่อนที่จะโหลดโมดูลที่ต้องการในคำอื่น ๆ การกำหนดค่า บล็อกของโมดูลที่ต้องการดำเนินการก่อนบล็อกการกำหนดค่าของโมดูลที่ต้องการ "
Mark Rajcok

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