Angular2 เพิ่มคลาสให้กับแท็กเนื้อหา


103

ฉันจะเพิ่มคลาสลงในแท็กเนื้อหาได้อย่างไรโดยไม่ต้องทำให้เนื้อหาเป็นตัวเลือกแอปและใช้การเชื่อมโยงโฮสต์

ฉันลองใช้ Renderer แต่มันเปลี่ยนทั้งร่างกาย

คลาสผูกมุม 2.x บนแท็กร่างกาย

ฉันกำลังทำงานกับแอพ angular2 ขนาดใหญ่และการเปลี่ยนตัวเลือกรูทจะส่งผลกระทบต่อโค้ดจำนวนมากฉันจะต้องเปลี่ยนรหัสจำนวนมาก

กรณีการใช้งานของฉันคือ:

เมื่อฉันเปิดส่วนประกอบโมดอล (สร้างแบบไดนามิก) ฉันต้องการให้แถบเลื่อนเอกสารซ่อน


1
จริงๆแล้วถ้าคุณทำงานกับ js within html page ปัญหาในการใช้งานdocument.body.className|classListคืออะไร?
yurzui

ฮ่าฮ่าถ้ามันง่ายขนาดนั้น :) แต่การเข้าถึง Dom โดยตรงก็เป็นการปฏิบัติที่ไม่ดี
Rachid O

คุณสามารถเขียนกระดาษห่อใหญ่ที่จะถูกดำเนินการสองหลายและในตอนท้ายเพิ่มเพื่อclass bodyหากคุณจะไม่ใช้การแสดงผลเซิร์ฟเวอร์หรือผู้ปฏิบัติงานบนเว็บสิ่งที่คุณกลัว?
yurzui

ไม่มีทางออกที่ดีไปกว่านี้อีกแล้ว?
Rachid O

4
ฉันไม่เข้าใจคนที่ไม่เหมาะสมเหล่านี้ที่ลงคะแนนและปิดคำถามโดยไม่มีเหตุผลที่ถูกต้อง
Rachid O

คำตอบ:


223

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

  1. ใส่เอกสารสากล มันอาจไม่ใช่แนวทางปฏิบัติที่ดีที่สุดเพราะฉันไม่รู้ว่า nativescript etc รองรับหรือไม่ แต่อย่างน้อยก็ดีกว่าใช้ JS บริสุทธิ์
ตัวสร้าง (เอกสารส่วนตัว @Inject (DOCUMENT): เอกสาร) {}

ngOnInit () {
   this.document.body.classList.add ('ทดสอบ');
}

ดีและอาจจะดีกว่า คุณสามารถฉีดตัวแสดงผลหรือตัวแสดงผล 2 (บน NG4) และเพิ่มคลาสด้วยตัวแสดงผล

คลาสส่งออก myModalComponent ใช้ OnDestroy {

  ตัวสร้าง (ตัวแสดงผลส่วนตัว: Renderer) {
    this.renderer.setElementClass (document.body, 'modal-open', true);
   }

  ngOnDestroy () {
    this.renderer.setElementClass (document.body, 'modal-open', false);
  }

แก้ไขสำหรับ ANGULAR4:

นำเข้า {Component, OnDestroy, Renderer2} จาก "@ angular / core";

คลาสส่งออก myModalComponent ใช้ OnDestroy {

  ตัวสร้าง (ตัวแสดงผลส่วนตัว: Renderer2) {
    this.renderer.addClass (document.body, 'modal-open');
   }

  ngOnDestroy () {
    this.renderer.removeClass (document.body, 'modal-open');
  }

3
ขอบคุณสำหรับคำตอบฉันคิดว่าการใช้เรนเดอร์เป็นทางออกที่ดีที่สุด
Rachid O

6
ในกรณีที่ใครสงสัยว่าจะหาเอกสารได้ที่ไหน:import { DOCUMENT } from '@angular/platform-browser'
Neph

15
โซลูชัน Renderer นั้นดีกว่ามาก ใน Angular 4 Renderer ถูกเลิกใช้งานและแทนที่ด้วย Renderer2 รหัสจะต้องเปลี่ยนเป็น: this.renderer.addClass(document.body, 'modal-open'); และthis.renderer.removeClass(document.body, 'modal-open');
GreyBeardedGeek

3
นอกจากนี้ยัง@Inject(DOCUMENT)ไม่จำเป็นในตัวสร้างอีกต่อไป
GreyBeardedGeek

3
เนื่องจากการอัปเดตของ @Neph: การนำเข้า DOCUMENT จากแพลตฟอร์มเบราว์เซอร์จึงเลิกใช้งาน ใช้ @ angular / common แทน
Pieter De Bie

43

ฉันคิดว่าวิธีที่ดีที่สุดคือการรวมกันของทั้งสองวิธีโดย DaniS ด้านบน: การใช้ renderer เพื่อตั้งค่า / ลบคลาสจริง ๆ แต่ยังใช้ document injector ดังนั้นจึงไม่ขึ้นอยู่กับอย่างมากwindow.documentแต่สามารถแทนที่ได้แบบไดนามิก (เช่นเมื่อแสดงผลฝั่งเซิร์ฟเวอร์) ดังนั้นรหัสทั้งหมดจะมีลักษณะดังนี้:

import { DOCUMENT } from '@angular/common';
import { Component, Inject, OnDestroy, OnInit, Renderer2 } from '@angular/core';

@Component({ /* ... */ })
export class MyModalComponent implements OnInit, OnDestroy {
    constructor (
        @Inject(DOCUMENT) private document: Document,
        private renderer: Renderer2,
    ) { }

    ngOnInit(): void {
        this.renderer.addClass(this.document.body, 'embedded-body');
    }

    ngOnDestroy(): void {
        this.renderer.removeClass(this.document.body, 'embedded-body');
    }
}

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