Angular2 menambahkan kelas ke tag tubuh

99

Bagaimana cara menambahkan kelas ke tag body tanpa menjadikan body sebagai pemilih aplikasi dan menggunakan pengikatan host?

Saya mencoba menggunakan Renderer tetapi mengubah seluruh tubuh

Angular 2.x mengikat kelas pada tag tubuh

Saya sedang mengerjakan aplikasi angular2 besar dan mengubah pemilih root akan memengaruhi banyak kode, saya harus mengubah banyak kode

Kasus penggunaan saya adalah ini:

Ketika saya membuka komponen modal (dibuat secara dinamis), saya ingin menyembunyikan bilah gulir dokumen

Rachid O
sumber
1
Sebenarnya jika Anda bekerja dengan js di dalam halaman html, apa masalahnya document.body.className|classList?
yurzui
haha seandainya semudah itu :) tapi itu praktik yang buruk untuk mengakses dom secara langsung
Rachid O
Anda dapat menulis pembungkus besar yang akan dieksekusi beberapa detik dan pada akhirnya ditambahkan classke body. Jika Anda tidak akan menggunakan rendering server atau pekerja web, apa yang Anda takutkan?
yurzui
jadi tidak ada solusi yang lebih baik dari ini?
Rachid O
4
Saya tidak dapat memahami orang-orang yang kasar ini yang menolak dan menutup pertanyaan tanpa alasan yang sah
Rachid O

Jawaban:

216

Saya ingin berkomentar. Tetapi karena reputasi yang hilang saya menulis jawaban. Saya tahu dua kemungkinan untuk menyelesaikan masalah ini.

  1. Masukkan Dokumen Global. Yah itu mungkin bukan praktik terbaik karena saya tidak tahu apakah nativescript dll mendukungnya. Tapi setidaknya lebih baik daripada menggunakan JS murni.
konstruktor (@Inject (DOKUMEN) dokumen pribadi: Dokumen) {}

ngOnInit () {
   this.document.body.classList.add ('test');
}

Yah dan mungkin lebih baik. Anda bisa menyuntikkan perender atau perender 2 (pada NG4) dan menambahkan kelas dengan perender.

kelas ekspor myModalComponent mengimplementasikan OnDestroy {

  konstruktor (perender pribadi: Renderer) {
    this.renderer.setElementClass (document.body, 'modal-open', true);
   }

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

EDIT UNTUK ANGULAR4:

impor {Komponen, OnDestroy, Renderer2} dari '@ angular / core';

kelas ekspor myModalComponent mengimplementasikan OnDestroy {

  konstruktor (perender pribadi: Renderer2) {
    this.renderer.addClass (document.body, 'modal-open');
   }

  ngOnDestroy () {
    this.renderer.removeClass (document.body, 'modal-open');
  }
DaniS
sumber
3
terima kasih atas jawabannya, saya pikir menggunakan rendrer adalah solusi terbaik
Rachid O
6
Jika ada yang bertanya-tanya di mana mendapatkan DOKUMEN, itu adalah:import { DOCUMENT } from '@angular/platform-browser'
Nef
14
Solusi Renderer jauh lebih baik. Di Angular 4, Renderer sudah tidak digunakan lagi dan diganti dengan Renderer2. Kode tersebut harus diubah menjadi: this.renderer.addClass(document.body, 'modal-open'); danthis.renderer.removeClass(document.body, 'modal-open');
GreyBeardedGeek
3
Juga, @Inject(DOCUMENT)tidak lagi diperlukan dalam konstruktor
GreyBeardedGeek
3
Sebagai pembaruan untuk @Neph: mengimpor DOKUMEN dari platform-browser sudah tidak digunakan lagi. Gunakan @ angular / umum sebagai gantinya.
Pieter De Bie
39

Saya pikir cara terbaik untuk melakukannya adalah kombinasi dari kedua pendekatan oleh DaniS di atas: Menggunakan penyaji untuk benar-benar mengatur / menghapus kelas, tetapi juga menggunakan injektor dokumen, jadi tidak terlalu bergantung pada window.documenttetapi itu dapat diganti secara dinamis (misalnya, saat merender sisi server). Jadi seluruh kode akan terlihat seperti ini:

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');
    }
}
DHainzl
sumber
8
Terima Kasih, Terima Kasih, Terima Kasih, Terima Kasih, Terima Kasih, Terima Kasih, Terima Kasih :)
Kamlesh