Angular: как программно установить стиль css для тела как важный в машинописном тексте

Под моим угловым приложением

Я использую этот код для установки пользовательского стиля тела:

  constructor(private elementRef: ElementRef) { }

  ngOnInit() {
    this.elementRef.nativeElement.ownerDocument.body.style.overflowY = 'hidden';
  }

для некоторых конкретных сценариев я должен добавить к нему важно

это было бы так:

   this.elementRef.nativeElement.ownerDocument.body.style.overflowY = 'hidden !important';

Но это не работает, и главное не добавляется в стиль.

Отметить ; поскольку мне нужно применить это к самому телу, а не к конкретному элементу html, кроме моего компонента, ngStyle не может этого сделать.

Предложения ??


person firasKoubaa    schedule 07.07.2020    source источник
comment
Отвечает ли это на ваш вопрос? Я не могу внедрить стиль с помощью !important правило   -  person Nico O    schedule 07.07.2020


Ответы (4)


Это должно работать.

this.elementRef.nativeElement.ownerDocument.body.style.setProperty("overflow-y", "hidden", "important");
person JerMah    schedule 07.07.2020
comment
Но ПОЧЕМУ вообще использовать для этого Angular?? Я просто не понимаю, почему body { overflow-y : hidden !important } в CSS не работает? Зачем использовать Angular с elementRef, ngOnInit и всем остальным, просто чтобы добавить базовое правило CSS в тело? Мне действительно кажется, что мы решаем чрезвычайно простую задачу с очень сложным решением - person Jeremy Thille; 08.07.2020
comment
@JeremyThille, очевидно, он делает что-то не так, если вам нужно использовать такой js в angular. Но у всех нас были такие ситуации, когда просто нужно было быстро исправить что-то, что в противном случае могло бы стать слишком сложным. - person JerMah; 08.07.2020

Когда вам нужно добавить класс к body, хорошим вариантом будет Renderer2. Сначала создайте 2 класса:

.overflowYHidden {
  overflow-y: hidden;
}
.overflowYHiddenImportant {
  overflow-y: hidden !important;
}

Теперь используйте рендерер:

import { Renderer2, RendererFactory2 } from '@angular/core';

// class declaration skipped

_renderer: Renderer2;

constructor(rendererFactory: RendererFactory2) {
  this._renderer = rendererFactory.createRenderer('body', null);
}

Я не знаю, какую логику вы используете для использования важного:

if (someCondition) {
  this._renderer.addClass(document.body, 'overflowYHidden');
  this._renderer.removeClass(document.body, 'overflowYHiddenImportant');
} else {
  this._renderer.addClass(document.body, 'overflowYHiddenImportant');
  this._renderer.removeClass(document.body, 'overflowYHidden');
}
person inorganik    schedule 07.07.2020

HTML:

<h2 #elem>hiper king</h2>

ts:

импортировать {Компонент, ViewChild, Renderer2, ElementRef, AfterViewInit} из '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent implements AfterViewInit {
  title = 'stackApp';
  @ViewChild('elem') elem: ElementRef;
  constructor(private renderer: Renderer2) { }
  ngAfterViewInit() {
    this.renderer.setAttribute(this.elem.nativeElement, 'style', 'overflowY: hidden !important');
  }
}

Попробуй это

Ссылка: Либо я неправильно использую Angular Renerer2, либо он не работает. Кто-нибудь может это понять?

person Yerrapotu ManojKiran    schedule 07.07.2020

Попробуй это. Зачем использовать elementRefs? Просто используйте [ngStyle]

<div [ngStyle]="{ 'overflowY' : 'hidden !important' }"></div>

or

<div [style.overflowY ]="'hidden !important'"></div>

Кроме того, если это происходит автоматически при загрузке (в ngOnInit), почему бы просто не закодировать это в вашем шаблоне? И почему бы вам просто не использовать CSS и добавить его с помощью Angular?

person Jeremy Thille    schedule 07.07.2020
comment
мне нужно применить собственный стиль к телу, это не для простого элемента на стороне моего компонента - person firasKoubaa; 07.07.2020
comment
Так почему вы вообще используете Angular? Почему бы вам не применить CSS непосредственно к телу? Я потерялся, мне кажется, что вы хотите сделать что-то чрезвычайно простое очень сложным способом - person Jeremy Thille; 08.07.2020
comment
нет ; Я могу программно активировать/деактивировать прокрутку на главной странице после нажатия кнопки c (которая открывает всплывающее окно) - person firasKoubaa; 08.07.2020
comment
Но все же, зачем вам для этого нужен Angular? Подойдет простая ванильная строка Javascript. Выберите тело, добавьте или удалите класс, работа сделана. Это все еще слишком сложно. - person Jeremy Thille; 08.07.2020
comment
потому что это в основном угловое приложение, - person firasKoubaa; 08.07.2020
comment
arghhhhh Хорошо, так что вы просто не поймете мою точку зрения. Просто продолжайте использовать ElementRefs и ngOnInit, когда вы можете просто переключать класс одной строкой чистого JS В ВАШЕМ КОМПОНЕНТЕ ANGULAR, чтобы он по-прежнему управлялся Angular, если вам нужно, но без всех этих сложных вещей. Я бы сделал это одной строкой в ​​своем приложении Angular, но вы абсолютно точно хотите использовать множество сложных вещей и обходных путей, чтобы достичь того же результата, так что... что бы вы ни плавали в своей лодке ¯\_(ツ)_/¯ я сдаюсь - person Jeremy Thille; 08.07.2020
comment
почему ты сердишься, вот в чем дело; я хочу настроить переполнение тела при открытии всплывающего окна и закрытии его ... если вы можете это сделать, покажите мне, как - person firasKoubaa; 09.07.2020