Связать переменные AngularJS с синтаксисом CSS

Я пытаюсь понять, как связать облавы области AngularJS с синтаксисом CSS. Я думаю, что проблема в фигурных скобках. Вот что я в основном пытаюсь сделать:

<style>.css_class {background:{{ angular_variable }}; color:#ffffff;}</style>
<style>.css_rule {background:{{ "#000000" }}; color:#ffffff;}</style>
<style>.css_rule {background:{{ var | someFilter }}; color:#ffffff;}</style>

Любые идеи о том, как это можно сделать? Спасибо!

Ответы

Ответ 1

Как объяснено здесь angular не запускается в содержимом внутри тегов стиля. В этой статье есть обходное решение, но в качестве более гибкого подхода я просто создаю директиву, которая захватывает содержимое, анализирует их и заменяет:

Обновленный ответ

app.directive('parseStyle', function($interpolate) {
    return function(scope, elem) {
        var exp = $interpolate(elem.html()),
            watchFunc = function () { return exp(scope); };

        scope.$watch(watchFunc, function (html) {
            elem.html(html);
        });
    };
});

Использование:

<style parse-style>.css_class {color: {{ angular_variable }};}</style>

http://jsfiddle.net/VUeGG/31/


Оригинальный ответ

app.directive('parseStyle', function()
{
    return function(scope, elem)
    {
        elem.html(scope.$eval('\'' + elem.html() + '\''));
    };
});

то

<style parse-style>.css_class {color: ' + angular_variable + ';}</style>

Не уверен в поддержке браузера для этого.

http://jsfiddle.net/VUeGG/4/

Ответ 2

Обновление

Я собрал плагин Angular "(модуль + фильтры + factory) , называемый ngCss, который обрабатывает это и многое другое - проверить его!

Я также сделал версию Vanilla Javascript (например, никаких внешних зависимостей); CjsSS.js ( GitHub).

ngCss - это маленький * Angular модуль + Factory + фильтры, который позволяет связывать строки и объекты (включая вложенные объекты) внутри CSS. * Minified + сжатый script до 1,700 байт

Особенности:

  • CSS может быть связан с проживанием (изменения в $scope являются $watch 'ed) или обновлены с помощью настраиваемого события $broadcast eventCss.
  • css и cssInline Фильтры выводят Javascript/JSON objects как CSS для включения миксинов, включая возможность вложенности objects.
  • $scope может быть инициализирован в самом CSS, позволяя размещать всю связанную с CSS информацию в элементе *.css или STYLE.
  • $scope можно изолировать или импортировать из любого Angular $element (через angular.element($element).scope()).

Оригинал Благодаря @jonnyynnoj коду я выяснил способ сохранить номенклатуру {{angular_variable}} в тегах стиля, а также привязать к ним любые изменения. Посмотрите на вилку @jonnyynnoj code для простого примера или посмотрите ниже, что я использую в своих приложениях:

(function (ngApp) {
    'use strict';

    //# Live bind a <style cn-styler="{ commented: true, usingSingleQuote: true }" /> tag with {{ngVars}}
    ngApp.directive('cnStyler', function () {
        return {
            //# .restrict the directive to attribute only (e.g.: <style cn-styler>...</style>)
            restrict: "A",
            link: function ($scope, $element, $attrs, controllers) {
                //# .$eval the in-line .options and setup the updateCSS function
                //#     NOTE: The expected string value of the inline options specifies a JSON/JavaScript object, hence the `|| {}` logic
                var css, regEx,
                    options = $scope.$eval($attrs["cnStyler"]) || {},
                    updateCSS = function () {
                        //# .$eval the css, replacing the results back into our $element .html
                        $element.html($scope.$eval(css));
                    }
                ;

                //# Setup the .quote and the inverse in .unquote (which we use to process the css)
                //#     NOTE: In theory, the .unquote should not be present within the css
                options.quote = (options.usingSingleQuote !== false ? "'" : '"');
                options.unquote = (options.quote === '"' ? "'" : '"');
                regEx = new RegExp(options.unquote, "g");

                //# Process the $element .html into css, .replace'ing any present .unquote with .quote (this could cause problems), then the {{Angular}} (or /*{{Angular}}*/) variables with ' + stringified_versions + '
                if (options.commented !== false) {
                    css = options.unquote + ($element.html() + '')
                        .replace(regEx, options.quote)
                        .replace(/\/\*{{/g, options.unquote + "+")
                        .replace(/}}\*\//g, "+" + options.unquote)
                    + options.unquote;
                } else {
                    css = options.unquote + ($element.html() + '')
                        .replace(regEx, options.quote)
                        .replace(/{{/g, options.unquote + "+")
                        .replace(/}}/g, "+" + options.unquote)
                    + options.unquote;
                }

                //# .$watch for any changes in the $scope, calling our updateCSS function when they occur
                $scope.$watch(updateCSS);
            }
        };
    });

})(YOUR_NG_APP_VAR_HERE);

Затем вы используете эту директиву следующим образом:

<style cn-styler type="text/css">
    .myClass{
        color: /*{{themeColor}}*/;
    }
</style>

Где вы установили $scope.themeColor где-то в своем контроллере, и вы заменили YOUR_NG_APP_VAR_HERE своей переменной ngApp.

ПРИМЕЧАНИЯ:

Убедитесь, что ваш ng-controller определяется с областью действия тегом <style>, поскольку тег <style> должен находиться в <head>, тогда как ng-controller обычно определяется тегом <body> или ниже. TL; DR: Поместите свой ng-controller в свой тег <html> так:

<html ng-app="YOUR_NG_APP_VAR_HERE" ng-controller="MyNgController">

Из-за синтаксического анализа и автоматического форматирования CSS в таких инструментах, как Visual Studio, я добавил эту функцию, чтобы иметь {{Angular}} vars в комментариях CSS (например, /*{{Angular}}*/). Это поведение по умолчанию по умолчанию, если вы не переопределили его так:

<style cn-styler="{commented: false}" >...</style>

В связи с природой этого решения (CSS .$eval, как строка с включенными переменными), необходимо также использовать присутствие одиночных или двойных кавычек в CSS. По умолчанию в директиве предполагается, что вы используете одиночные кавычки (') в своем CSS, что означает, что во избежание любых введенных ошибок вам следует использовать только одиночные кавычки в CSS, как любые двойные кавычки, присутствующие в CSS будут заменены одинарными кавычками. Вы можете переопределить это поведение по умолчанию (это означает, что вы используете двойные кавычки в своем CSS):

<style cn-styler="{usingSingleQuote: false}" >...</style>

Существуют граничные случаи, когда замена двойных кавычек одиночными кавычками закручивает CSS (например, в content), поэтому вы хотите убедиться, что используете только один стиль кавычек в своем CSS (и сигнализацию соответственно), чтобы избежать возможных проблем. К счастью, кавычки редко используются в CSS, поэтому это в основном не проблема.

Ответ 3

Вам не нужны фигурные скобки, поскольку они оцениваются внутри директивы html - вам нужно всего лишь использовать фигурные скобки, если у вас есть выражение, которое оценивается вне их, т.е.

<p ng-class="some-angular-variable">
  {{some-angular-variable}}
</p> 

В вашей ситуации удаление двухлепестковых фигурных скобок и использование двойных кавычек должно решить проблему.

Как в стороне, Чандермани на деньги - то, что вы пытаетесь, лучше выполнить с директивой ng-class. Использование этого метода позволит применить класс (или несколько) к соответствующему тегу.

т

<p ng-class="mystyle">
    some text
</p>

скажем, у вас есть два класса style1 и style2

Вы можете выбрать тот, который будет применяться с помощью

scope.mystyle = "style1" // or whatever

в вашем контроллере.

Ответ 4

Я не могу понять, почему вы хотите использовать эту идею! U должен использовать для этого ng-класс!

Например:

<p ng-class="{strike: strike, bold: bold, red: red}">Map Senter code hereyntax Example</p>