2017-04-21 77 views
23

如何将身体标记添加到身体标记中而不将身体作为应用选择器并使用主机绑定?Angular2将类添加到身体标记

我试过unsing渲染器,但它改变了整个身体

Angular 2.x bind class on body tag

我工作的一大angular2应用程序,并更改根选择将影响大量的代码,>我将有当我打开一个模态分量(动态创建的),我希望文档滚动条隐藏

+1

其实,如果你的HTML页面中的JS什么用'document.body.className问题工作| classList'? – yurzui

+0

哈哈,如果只是这么简单:)但是直接访问dom是个不好的习惯 –

+0

你可以编写一个大的包装器,它会执行几秒钟,最后在'body'中添加'class'。如果你不打算使用服务器渲染或网络工作者,你害怕什么? – yurzui

回答

52

我很想评论 :改变了很多代码

我的使用情况是这样的。但由于缺少名誉,我写了一个答案。 那么我知道解决这个问题的两种可能性。

  1. 注入全局文档。那么它可能不是最好的做法,因为我不知道nativescript等支持。但它至少比使用纯JS更好。
 

     constructor(@Inject(DOCUMENT) private document: Document) { 

     } 



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

好,甚至更好。您可以注入渲染器或渲染器2(在NG4上)并将渲染器添加到渲染器中。

 
export class myModalComponent implements OnDestroy { 

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

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

编辑ANGULAR4:

 
export class myModalComponent implements OnDestroy { 

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

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

感谢您的答复,我认为使用rendrer是最好的解决方案 –

+4

如果任何人想知道从哪里获得DOCUMENT,即: '从'@ angular/platform-b​​rowser''导入{DOCUMENT}' – Neph

+7

Renderer解决方案要好得多。 在Angular 4中,Renderer已被弃用,并被Renderer2所取代。 该代码将不得不改变到: 'this.renderer.addClass(document.body的, '模态开');' 和'this.renderer.removeClass(document.body的, '模态开' );' – GreyBeardedGeek