Angular 2: วิธีจัดองค์ประกอบองค์ประกอบโฮสต์ขององค์ประกอบได้อย่างไร


189

ฉันมีองค์ประกอบใน Angular 2 เรียกว่า my-comp:

<my-comp></my-comp>

หนึ่งลักษณะสไตล์องค์ประกอบโฮสต์ขององค์ประกอบนี้ใน Angular 2 ได้อย่างไร

ในพอลิเมอร์คุณจะต้องใช้ตัวเลือก ": host" ฉันลองเป็นแบบ Angular 2 แต่มันไม่ทำงาน

:host {
  display: block;
  width: 100%;
  height: 100%;
}

ฉันยังลองใช้ส่วนประกอบเป็นตัวเลือก:

my-comp {
  display: block;
  width: 100%;
  height: 100%;
}

วิธีการทั้งสองดูเหมือนจะไม่ทำงาน

ขอบคุณ


2
คุณแน่ใจหรือว่าไม่ใช้สไตล์นี้ ฉันได้ทำโครงการพื้นฐานและทำอย่างนั้นและได้ผล ฉันตั้งค่าไว้my-selector { color : red}ใน css แล้วและใช้งานได้ดี
Pacane

1
ในฐานะของเบต้า 7 ตัวเลือกโฮสต์ใช้งานได้สำหรับฉัน
Jon Swanson

คำตอบ:


285

มีข้อผิดพลาด แต่ได้รับการแก้ไขในระหว่างนี้ :host { }ทำงานได้ดีในขณะนี้

ยังรองรับคือ

  • :host(selector) { ... }เพื่อselectorให้ตรงกับคุณลักษณะคลาส ... บนองค์ประกอบโฮสต์
  • :host-context(selector) { ... }สำหรับselectorจับคู่องค์ประกอบคลาส ... กับคอมโพเนนต์พาเรนต์

  • selector /deep/ selector(นามแฝงใช้selector >>> selectorไม่ได้กับ SASS) เพื่อให้สไตล์ตรงกับขอบเขตขององค์ประกอบ

    • UPDATE: SASS /deep/เป็นหึ
      เพิ่ม Angular (TS และ Dart) ::ng-deepเพื่อทดแทนซึ่งรองรับ SASS ได้เช่นกัน

    • UPDATE2: ::slotted ::slottedได้รับการสนับสนุนโดยเบราว์เซอร์ใหม่ทั้งหมดและสามารถใช้กับ `ViewEncapsulation.ShadowDom
      https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted

ดูเพิ่มเติมโหลดสไตล์ css ภายนอกลงใน Angular 2 Component

/deep/และ>>>จะไม่ได้รับผลกระทบจาก combinators ตัวเลือกเดียวกันกับใน Chrome ซึ่งเลิกใช้แล้ว
Angular emulate (rewrites) พวกมันดังนั้นจึงไม่ขึ้นอยู่กับเบราว์เซอร์ที่รองรับ

นี่คือสาเหตุ/deep/และ>>>ไม่ทำงานด้วยViewEncapsulation.Nativeซึ่งเปิดใช้งาน shadow shadow DOM และขึ้นอยู่กับการสนับสนุนเบราว์เซอร์


@Component({selector: 'some-selector', template: 'xxx', styles: [':host { display: block; background-color: green; border: solid 1px red; }']}) export class SomeClass {}
GünterZöchbauer

@ OndraŽižkaคุณช่วยอธิบายเพิ่มเติมได้ไหม? นี่คือ CSS ที่บริสุทธิ์มันจะไม่สอดคล้องกับ CSS และตัวมันเองได้อย่างไร?
GünterZöchbauer

นอกจากว่าฉันพลาดการเปลี่ยนแปลงที่สำคัญบางอย่างใน CSS / / ลึก / และ >>> ไม่ใช่ CSS
Ondra Žižka

พวกเขาเลิกใช้แล้ว แต่นั่นไม่สำคัญ พวกเขาจะเทิดทูนโดยเชิงมุม (เขียนใหม่) ดังนั้นพวกเขาจะทำงานร่วมกับViewEncapsularion.Emulated(เริ่มต้น) Nativeแต่ไม่ได้มี
GünterZöchbauer

ใน Angular 2.4.7 ฉันสามารถ:host { p { font-size: 80%; } }ทำงานในไฟล์ ... component.css ทันทีที่ฉันลองใช้กับstyles: [:host { p { font-size: 80%; } }]มันจะใช้งานไม่ได้อีกต่อไป ที่แปลกมาก.
Martin

39

ฉันพบวิธีแก้ปัญหาในการจัดองค์ประกอบองค์ประกอบ ฉันไม่พบเอกสารใด ๆ ว่ามันทำงานอย่างไร แต่คุณสามารถใส่ค่าคุณลักษณะลงในคำสั่งส่วนประกอบภายใต้คุณสมบัติ 'โฮสต์' เช่นนี้:

@Component({
    ...
    styles: [`
      :host {
        'style': 'display: table; height: 100%',
        'class': 'myClass'
      }`
})
export class MyComponent
{
    constructor() {}

    // Also you can use @HostBinding decorator
    @HostBinding('style.background-color') public color: string = 'lime';
    @HostBinding('class.highlighted') public highlighted: boolean = true;
}

อัปเดต: ตามที่GünterZöchbauerพูดถึงมีข้อบกพร่องและตอนนี้คุณสามารถจัดรูปแบบองค์ประกอบโฮสต์แม้ในไฟล์ css เช่นนี้:

:host{ ... }

1
ฉันชอบสิ่งนี้ดีกว่าการสร้างองค์ประกอบ. root แบบจำลอง แต่ฉันไม่ชอบที่จะกำหนดสไตล์เหล่านี้เป็นแบบอินไลน์ (บังคับ!importantให้แทนที่) จะต้องมี waayy ที่ดีกว่า: \
Scrimothy

4
ไม่มีการจัดแต่งทรงผ่านhost{}ในstylesUrlไฟล์ไม่ได้ทำงาน :hostจำเป็น
phil294

เราจะเข้าถึงตัวแปรองค์ประกอบภายในโฮสต์ได้อย่างไร ถ้าฉันต้องการตัดสินใจสีพื้นหลังแบบไดนามิก? ': โฮสต์ {background-color: this.bgColor; } '
Pratap AK

@ PratapA.K สวัสดีคุณสามารถใช้ HostBinding derorator คุณจะเป็นตัวอย่าง: @HostBinding('style.background-color') private color = 'lime'; Google จะพบตัวอย่างและบทความมากมายให้คุณ
prespic

11

ตรวจสอบปัญหานี้ ฉันคิดว่าข้อผิดพลาดจะได้รับการแก้ไขเมื่อตรรกะการรวบรวมข้อมูลล่วงหน้าของเทมเพลตใหม่จะถูกนำไปใช้ สำหรับตอนนี้ฉันคิดว่าสิ่งที่ดีที่สุดที่คุณสามารถทำได้คือการห่อเทมเพลตของคุณ<div class="root">และใส่สไตล์นี้div:

@Component({ ... })
@View({
  template: `
    <div class="root">
      <h2>Hello Angular2!</h2>
      <p>here is your template</p>
    </div>
  `,
  styles: [`
    .root {
      background: blue;
    }
  `],
   ...
})
class SomeComponent {}

ดูพลั่วนี้


9

ในคอมโพเนนต์ของคุณคุณสามารถเพิ่ม. class ให้กับองค์ประกอบโฮสต์ของคุณหากคุณต้องการมีสไตล์ทั่วไปที่คุณต้องการใช้

export class MyComponent{
     @HostBinding('class') classes = 'classA classB';

6

สำหรับทุกคนที่กำลังมองหาสไตล์ลูกองค์ประกอบของ:hostที่นี่เป็นตัวอย่างของวิธีการใช้::ng-deep

:host::ng-deep <child element>

เช่น :host::ng-deep span { color: red; }

อย่างที่คนอื่นบอกว่า/deep/เลิกใช้แล้ว


4

ลองใช้: host> / deep /:

เพิ่มสิ่งต่อไปนี้ในไฟล์ parent.component.less

:host {
    /deep/ app-child-component {
       //your child style
    }
}

แทนที่ส่วนประกอบของแอพโดยตัวเลือกลูกของคุณ


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