การใช้ส่วนประกอบจากโมดูลที่นำเข้าภายในโมดูลลูก

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

นี่คือโมดูลที่แชร์ของฉันในโฟลเดอร์รูทพร้อมส่วนประกอบที่ฉันต้องการใช้:

แอป/shared/shared.module.ts

import {dtComponent} from './dt.component';

@NgModule({
  imports: [
    CommonModule
  ],
  exports: [
    dtComponent
  ],
  declarations: [
    dtComponent
  ]
})
export class DatePModule{ }

ฉันมีโมดูลอื่นในโฟลเดอร์แอปที่นำเข้า DatePModule เช่นนี้:

แอป/ผู้ติดต่อ/contacts.module.ts

import {DatePModule} from '../shared/shared.module.ts';

@NgModule({
  imports: [
    CommonModule,
    DatePModule
  ]
})
export class CTModule{ }

ฉันจำเป็นต้องใช้ dtComponent ในส่วนประกอบบางส่วนของ CTModule โดยตรง แต่ยังต้องการส่วนประกอบนี้ในส่วนประกอบอื่น ๆ ที่อยู่ในโมดูลย่อยของ CTModule

ฉันสามารถนำเข้า DatePModule อีกครั้งภายในโมดูลย่อยของ CTModule แต่ฉันไม่เชื่อว่านั่นเป็นแนวทางที่ดีที่สุด

แอป/ผู้ติดต่อ/อื่นๆ/other.module.ts

import {DatePModule} from '../../shared/shared.module.ts';

@NgModule({
  imports: [
    CommonModule,
    DatePModule
  ]
})
export class OtherModule{ }

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


person xzegga    schedule 14.08.2017    source แหล่งที่มา
comment
คุณใช้การโหลดแบบ Lazy Loading หรือเปล่า?   -  person Max Koretskyi    schedule 14.08.2017
comment
@Maximus ใช่ ฉันใช้การโหลดแบบ Lazy Loading เพื่อโหลดโมดูลและส่วนประกอบทั้งหมด   -  person xzegga    schedule 14.08.2017
comment
คำตอบของฉันยังคงเกี่ยวข้อง โมดูลที่แชร์และโหลดแบบขี้เกียจจะถูกรวมเข้าด้วยกันและแก้ไขการห่อหุ้มระหว่างการรวม   -  person Max Koretskyi    schedule 14.08.2017


คำตอบ (1)


ทำไมฉันต้องนำเข้า DatePModule อีกครั้งหากมีการนำเข้าในโมดูลหลักแล้ว

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

หากต้องการเรียนรู้เพิ่มเติม โปรดอ่าน การหลีกเลี่ยงความสับสนทั่วไปกับโมดูลใน Angular. นี่คือคำพูด:

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

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

ฉันสามารถนำเข้า DatePModule อีกครั้งภายในโมดูลลูกของ CTModule ได้ แต่ฉันไม่เชื่อว่านั่นเป็นแนวทางที่ดีที่สุด

นั่นเป็นแนวทางที่ถูกต้องหากคุณต้องการใช้ประเภทที่ประกาศได้จาก DatePModule ภายใน OtherModule

person Max Koretskyi    schedule 14.08.2017