Могу ли я использовать ключевое слово css! Important с директивой Angularjs ng?

У меня возникла проблема с boostrap3 и по умолчанию: прозрачный! Important ; настройка печати.
У меня есть необходимость показать горячую карту в моем webapp и напечатать ее.
Я использую директиву ng-style для этого, чтобы динамически вычислять необходимый фоновый цвет.
Короче говоря, это html-часть

<div class="heatmap" ng-style="scalecolor(10)">lorem ipsum</div>

и это часть контроллера

$scope.scalecolor = function(perc) {
        return { backgroundColor: plnkUtils.scaleColorInt('#EE0000', '#88FF00', perc) }
    };

Однако, поскольку bootstrap3 устанавливает все фоны в прозрачные с ключевым словом ! Important, я не могу их распечатать.

Это часть bootstrap 3.1.0 css, вызывающая проблему с отсутствующим фоном:

@media print {
  * {
    color: #000 !important;
    text-shadow: none !important;
    background: transparent !important;
    box-shadow: none !important;
  }
}

Поскольку обратный фон: прозрачный! Важный; is background: color hex code! important; (см. здесь) Я пытаюсь установить это с помощью ng-стиля, но тогда знак exclamantion заставляет Angularjs переворачиваться, когда я пытаюсь это сделать:

 $scope.scalecolor = function(perc) {
    return { backgroundColor: plnkUtils.scaleColorInt('#EE0000', '#88FF00', perc)  !important }
};

или, альтернативно, когда я пробую это в html-шаблоне

ng-style="scalecolor(10) !important"

Кто-нибудь, кто знает, как я могу использовать ключевое ключевое слово css с директивой Angularjs ng-style, чтобы переопределить подстановочный шаблон bootstrap3?

Для тех, кто хочет увидеть это своими глазами, вот плункер, показывающий проблему

Ответ 1

Видимо, вы не можете и это известная проблема, но есть кое-какое обходное решение, которое можно найти здесь:

https://github.com/angular/angular.js/issues/5379

Решение, приведенное ниже, было скопировано с сайта на случай, если ссылка сломается или изменится.

Вы не можете использовать !important директиву в свойстве свойства DOM в Chrome или FF (возможно, и в других). Атрибут style анализируется как CSS, но свойства HTMLElement.style этого не делают. К сожалению, вы не можете установить приоритет свойства здесь (по крайней мере, в Gecko/Blink/Webkit).

Итак, есть некоторые способы обхода:

Обходной путь №1

<ANY data-ng-attr-style="{{ blue && 'background-color: blue!important' || '' }}">
</ANY>

Это будет вашим лучшим способом в плане поддержки браузера, потому что приоритет свойства CSS будет корректно проанализирован здесь.

Обходной путь №2

Кроме того, вы также можете сделать следующее в javascript:

$scope.$watch(conditionalStyle);

function conditionalStyle() {
  if ($scope.blue) {
    $element[0].style.setProprety('background-color', 'blue', 'important');
  } else {
    $element[0].style.backgroundColor = '';
  }
}

Где $element - объект jQuery/jqLite, ссылающийся на элемент HTMLElement.

Примечание. Предостережения не поддерживаются в IE <9, поэтому обходной путь №1, вероятно, лучший выбор для такого поведения, когда вы зависите от приоритета свойства...

Ответ 2

Используя советы для @Wawy, я обновил свой код, чтобы заставить его работать.
Для тех, кто приземлился на этой странице, для уточнения я сделал обновленный Plunker, который можно найти здесь

Короче говоря, теперь это html-часть

<div class="heatmap" ng-attr-style="{{ngAttrScaleColor(10)}}">YES, ng-attr-style works !</div>

и это часть контроллера

$scope.ngAttrScaleColor = function(perc) {
        return  'background-color: ' + plnkUtils.scaleColorInt('#EE0000', '#88FF00', perc) + '!important';
 };