Angular2는 본문 태그에 클래스 추가


98

본문 을 앱 선택기로 만들고 호스트 바인딩을 사용 하지 않고 본문 태그에 클래스 를 추가하려면 어떻게 해야합니까?

렌더러를 사용해 보았지만 몸 전체가 바뀝니다

본문 태그의 Angular 2.x 바인드 클래스

저는 큰 angular2 앱에서 작업 중이며 루트 선택기를 변경하면 많은 코드에 영향을 미치므로 많은 코드를 변경해야합니다.

내 사용 사례는 다음과 같습니다.

모달 구성 요소 (동적으로 생성됨)를 열 때 문서 스크롤 막대를 숨기고 싶습니다.


1
실제로 html 페이지 내에서 js로 작업하면 사용하는 데 문제가 document.body.className|classList있습니까?
yurzui

하하 그것이 그렇게 간단하다면 :) 그러나 직접 dom에 액세스하는 것은 나쁜 습관입니다
Rachid O

당신은 몇 초를 실행하고 추가 끝에 될 큰 래퍼 쓸 수 class에를 body. 서버 렌더링이나 웹 워커를 사용하지 않으려면 무엇을 두려워합니까?
yurzui

그래서 이것보다 더 좋은 해결책은 없습니까?
Rachid O

4
나는 정당한 이유없이 질문을 반대 투표하고 종결하는이 학대적인 사람들을 이해할 수 없습니다
Rachid O

답변:


214

나는 논평하고 싶다. 하지만 평판이 없어서 답을 씁니다. 저는이 문제를 해결할 수있는 두 가지 가능성을 알고 있습니다.

  1. 글로벌 문서를 삽입하십시오. nativescript 등이 지원하는지 모르겠 기 때문에 모범 사례가 아닐 수도 있습니다. 그러나 적어도 순수한 JS를 사용하는 것보다 낫습니다.
constructor (@Inject (DOCUMENT) 비공개 문서 : 문서) {}

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

음, 아마도 더 좋을 것입니다. 렌더러 또는 렌더러 2 (NG4)를 삽입하고 렌더러와 함께 클래스를 추가 할 수 있습니다.

내보내기 클래스 myModalComponent 구현 OnDestroy {

  constructor (private renderer : Renderer) {
    this.renderer.setElementClass (document.body, 'modal-open', true);
   }

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

ANGULAR4 편집 :

'@ angular / core'에서 {Component, OnDestroy, Renderer2} 가져 오기;

내보내기 클래스 myModalComponent 구현 OnDestroy {

  constructor (private renderer : Renderer2) {
    this.renderer.addClass (document.body, 'modal-open');
   }

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

3
답장을 보내 주셔서 감사합니다, 나는 rendrer를 사용하여 생각하는 최고의 솔루션입니다
라시드 O

6
문서를 어디서 얻을 수 있는지 궁금한 사람은 다음과 같습니다.import { DOCUMENT } from '@angular/platform-browser'
Neph

14
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

36

이를 수행하는 가장 좋은 방법은 위의 DaniS의 두 가지 접근 방식의 조합이라고 생각합니다. 렌더러를 사용하여 실제로 클래스를 설정 / 제거하고 문서 주입기를 사용하므로에 크게 의존 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');
    }
}

8
감사합니다, 감사합니다, 감사합니다, 감사합니다, 감사합니다, 감사합니다, 감사합니다 :)
Kamlesh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.