“ มัณฑนากร” คืออะไรและใช้อย่างไร?


148

ฉันอยากรู้ว่านักตกแต่งคืออะไรใน AngularJS ไม่มีข้อมูลมากออนไลน์ตกแต่งประหยัดสำหรับการประกาศแจ้งในส่วนเอกสาร AngularJSและสั้น ๆ (แม้จะน่าสนใจ) กล่าวถึงในวิดีโอ YouTube

ในฐานะที่เป็นคนเชิงมุมใส่มัณฑนากรคือ:

ตกแต่งของบริการช่วยให้มัณฑนากรเพื่อสกัดกั้นการสร้างอินสแตนซ์ของบริการ อินสแตนซ์ที่ส่งคืนอาจเป็นอินสแตนซ์ดั้งเดิมหรืออินสแตนซ์ใหม่ที่มอบหมายให้กับอินสแตนซ์ดั้งเดิม

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

ฉันยังคงเป็น AngularJS noob ดังนั้นฉันแน่ใจว่ามันเป็นแค่ความไม่รู้และ / หรือนิสัยที่ไม่ดีที่ฉันเลือกมา

คำตอบ:


219

กรณีการใช้งานที่ดี$provide.decoratorคือเมื่อคุณต้องการ "ปรับแต่งเล็กน้อย" ในบริการบุคคลที่สาม / บริการต้นน้ำซึ่งโมดูลของคุณขึ้นอยู่กับขณะที่ออกจากบริการเหมือนเดิม (เพราะคุณไม่ใช่เจ้าของ / ผู้ดูแลบริการ) นี่คือการสาธิตเกี่ยวกับเสียงดังปัง


6
ตัวอย่างที่ดีเลิศ จริง ๆ แล้วฉันสงสัยว่าจะขยายฟังก์ชั่นโมดูลของบุคคลที่สามโดยไม่เข้าไปยุ่งกับพวกเขาได้อย่างไร
Arthur Kovacs

5
มัณฑนากรทำเป็ดทุกชนิดของบริการหรือไม่พวกเขาถูกกำหนดให้เป็นเพียงแค่โมดูลที่ตกแต่งพวกเขาหรือไม่? กล่าวอีกนัยหนึ่งว่าฉันมีโมดูล A ที่ตกแต่งบริการจากโมดูล B ฉันมีโมดูล C ที่ขึ้นอยู่กับโมดูล A และโมดูล B ภายในโมดูล C บริการของโมดูล B เป็นบริการดั้งเดิมหรือได้รับการตกแต่งหรือไม่
Jon Jaques

3
@JonJaques - นั่นเป็นคำถามที่ดี ฉันไม่ได้เจอสถานการณ์แบบนี้ ถ้าฉันต้องเดารุ่นของบริการที่โมดูล C ควรจะเป็นของตกแต่งจากโมดูล A แต่ฉันไม่สามารถพูดได้อย่างแน่นอนจนกว่าฉันจะลองด้วยตัวเอง ทำไมคุณไม่เขียน plunkr / jsffidle ง่ายๆแล้วลองทดสอบมันดู มันจะยอดเยี่ยมถ้าคุณสามารถแบ่งปันการค้นพบของคุณกับเรา ไชโย
tamakisquare

6
@JonJaques - ไม่สามารถระงับความอยากรู้ของฉันได้ดังนั้นฉันจึงเพิ่มสองสามบรรทัดในตัวอย่างดั้งเดิมของฉันเพื่อค้นหาคำตอบสำหรับคำถามลิงก์ของคุณ กล่าวโดยสรุปการเดาความคิดเห็นก่อนหน้าของฉันนั้นถูกต้อง
tamakisquare

17
โรงงาน, การบริการและอื่น ๆ เป็นแบบซิงเกิล
FlavourScape

66

มัณฑนากรช่วยให้เราสามารถแยกความกังวลข้ามและให้บริการเพื่อรักษาหลักการเดียวความรับผิดชอบโดยไม่ต้องกังวลเกี่ยวกับรหัส "โครงสร้างพื้นฐาน"

ใช้งานได้จริงของมัณฑนากร:

  • การแคช: ถ้าเรามีบริการที่อาจใช้การโทร HTTP ราคาแพงเราสามารถห่อบริการไว้ในมัณฑนากรแคชซึ่งจะตรวจสอบที่เก็บข้อมูลในเครื่องก่อนทำการโทรภายนอก
  • การดีบัก / ติดตาม: มีสวิตช์ขึ้นอยู่กับการกำหนดค่าการพัฒนา / การผลิตของคุณซึ่งตกแต่งบริการของคุณด้วยการดีบักหรือติดตาม wrappers
  • การควบคุมปริมาณ: ห่อสายที่ถูกเรียกบ่อย ๆ ในกระดาษห่อหุ้ม debouncing ช่วยให้เราสามารถโต้ตอบกับบริการที่ จำกัด อัตราได้อย่างง่ายดายตัวอย่างเช่น

ในทุกกรณีเหล่านี้เรา จำกัด รหัสในการบริการเพื่อความรับผิดชอบหลัก


10

decoratorสามารถดักจับอินสแตนซ์ของบริการที่สร้างโดยfactory, service, value, providerและให้ตัวเลือกในการเปลี่ยนแปลงบางอย่างinstance(service)ที่ไม่สามารถกำหนดค่าได้ / ด้วยตัวเลือก

$httpนอกจากนี้ยังสามารถให้การเยาะเย้ยถึงกรณีสำหรับการทดสอบวัตถุประสงค์เช่น


1
เป็นที่น่าสังเกตว่าคุณยังสามารถแทนที่directiveคำจำกัดความที่นำเสนอโดย Ben Nadel
David Salamon

นี่คือการอ้างอิงในเอกสารเชิงมุมอย่างเป็นทางการ: https://docs.angularjs.org/guide/decorators
David Salamon

3

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

เราไม่สามารถใช้ $ give.decorator กับค่าคงที่ได้เนื่องจากเราไม่สามารถเปลี่ยนค่าคงที่ที่พวกเขากำลังอ่านคุณสมบัติอย่างเดียว


1

ในการตกแต่งสั้น ๆ สามารถอธิบายได้ดังนี้: -

ฟังก์ชั่นมัณฑนากรขัดขวางการสร้างบริการช่วยให้สามารถแทนที่หรือปรับเปลี่ยนพฤติกรรมของบริการ

มันใช้$provideบริการโดยเชิงมุมและปรับเปลี่ยนหรือแทนที่การใช้งานของบริการอื่น

$provide.decorator('service to decorate',['$delegate', function($delegate) {
  // $delegate - The original service instance, 
  //             which can be replaced, monkey patched, 
  //             configured, decorated or delegated to. 
  //             ie here what is there in the 'service to decorate'

  //   This function will be invoked, 
  //   when the service needs to be provided 
  //   and should return the decorated service instance.
  return $delegate;
}]);

ตัวอย่าง:

$provide.decorator('$log', ['$delegate', function($delegate) {
  // This will change implementation of log.war to log.error
  $delegate.warn = $delegate.error; 
  return $delegate;
}]);

การประยุกต์ใช้งาน

นอกจากคำตอบ @JBland

  • การตั้งค่าตำแหน่งที่ตั้งของแอปพลิเคชันแบบกว้าง: -

    คุณสามารถหาตัวอย่างได้ที่นี่

  • เปลี่ยนพฤติกรรมเริ่มต้นของและการใช้บริการที่มีอยู่โดยบริการเชิงมุม: -

    คุณสามารถหาตัวอย่างได้ที่นี่

  • พฤติกรรมการสลับของฟังก์ชั่นในสภาพแวดล้อมที่แตกต่างกัน

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