如何使用AngularJS动态更新.less文件中的输入值变量

Posted

技术标签:

【中文标题】如何使用AngularJS动态更新.less文件中的输入值变量【英文标题】:How to update variables with input values in .less file dynamically using AngularJS 【发布时间】:2015-08-11 20:37:30 【问题描述】:

我意识到以前有人问过这个问题的一种形式(请参阅28208451),但是,我需要获取输入值,然后将其设置为新值,以便其他输入字段可以访问它。这是link to my plunk。

我可以输入一个新的色调,但是当我尝试改变饱和度或亮度时它没有被保存。我确信这是一个简单的解决方案(可能是一个指令),但对于我的生活,我无法绕过它。我在 AngularJS 还是相当新的......任何帮助将不胜感激。

**controller:** 
angular.module('colorChanger', [])
    .controller('ColorController', [

      function() 
        var vm = this;

        vm.hue = '194.3';
        vm.saturation = '100';
        vm.lightness = '50';
        vm.newHue = function() 
          if (vm.hue) 
            less.modifyVars(
              hue: vm.hue
            );
          
        ;
        vm.newSaturation = function() 
          if (vm.saturation) 
            less.modifyVars(
              saturation: vm.saturation
            );
          
        ;
        vm.newLightness = function() 
          if (vm.lightness) 
            less.modifyVars(
              lightness: vm.lightness
            );
          
        ;
      

    ]);

**index:**
<ul>
  <li class="bgc-color-base"></li>
</ul>

<form data-ng-submit="color.newHue()" data-ng-controller="ColorController as color">
  <label for="hue">Hue:</label>
  <input type="text" id="hue" data-ng-model="color.hue" />
  <input type="submit" value="Submit" />
</form>
<form data-ng-submit="color.newSaturation()" data-ng-controller="ColorController as color">
  <label for="saturation">Saturation:</label>
  <input type="text" id="saturation" data-ng-model="color.saturation" />
  <input type="submit" value="Submit" />
</form>
<form data-ng-submit="color.newLightness()" data-ng-controller="ColorController as color">
  <label for="lightness">Lightness:</label>
  <input type="text" id="lightness" data-ng-model="color.lightness" />
  <input type="submit" value="Submit" />
</form>

**less:**
ul 
  list-style: none;
  padding: 0;
  margin-bottom: 20px;
  li 
    height: 100px;
    &.bgc-color-base 
    .background-base;
    
  
    

//== color variables
@hue: 194.3; // enter optional hue variable or custom hue range 0-330
@saturation: 100; // saturation range 0-100
@lightness: 50; // lightness range 0-100 (0 = black, 100 = white)
@alpha: 1;

//== base color function
@color-base: hsla(@hue, (@saturation/100), (@lightness/100), @alpha);

//== base color mixins
.background-base(@hue: @hue, @saturation: @saturation, @lightness: @lightness, @alpha: @alpha) 
 background: @color-base;

【问题讨论】:

我不确定这里的用例是什么,但请记住,根据较少的文档'We recommend using less in the browser only for development' - 如果目标是动态更新背景,你可以使用 ng-style 指令在元素上设置内联样式。我有updated your plunkr。我个人认为浏览器内的修改应该使用类或可能的内联样式来处理,而不是更少。 我同意你的观点,通常我不会尝试,但我想在我正在构建的应用程序中创建一个现场演示,以演示使用 less 的颜色方案的幕后生成。这是一个pen,它显示了更少的代码。我意识到这已经用 codepen 完成了,但我认为创建一个不需要手动更改色调、饱和度和亮度变量的用户交互应用程序会很有趣。 实际上,无论哪种方式都需要编辑变量,但允许用户在窗口中交互会更加动态,然后必须手动编辑更少的代码。无论如何,我现在相信只嵌入笔是一种更好的方法。我想我只是太着迷于让它发挥作用,以至于忘记了它是否应该;)。感谢您的所有帮助! 【参考方案1】:

您应该为所有三个输入使用公共控制器,否则一个控制器中的范围值更改将不适用于另一个控制器

如果您想使用单独的控制器,那么您需要创建将所有变量的值存储在其中的服务。这将共享这些价值观。

创建一个方法来更新更少的变量,这将为您解决问题。

标记

<body data-ng-app="colorChanger" data-ng-controller="ColorController as color">
  <ul>
    <li class="bgc-color-base"></li>
  </ul>

  <form data-ng-submit="color.updateColor()" >
    <label for="hue">Hue:</label>
    <input type="text" id="hue" data-ng-model="color.hue" />
    <input type="submit" value="Submit" />
  </form>
  <form data-ng-submit="color.updateColor()"">
    <label for="saturation">Saturation:</label>
    <input type="text" id="saturation" data-ng-model="color.saturation" />
    <input type="submit" value="Submit" />
  </form>
  <form data-ng-submit="color.updateColor()">
    <label for="lightness">Lightness:</label>
    <input type="text" id="lightness" data-ng-model="color.lightness" />
    <input type="submit" value="Submit" />
  </form>

</body>

代码

vm.updateColor = function() 
    less.modifyVars(
        hue: vm.hue || 194.3,
        saturation: vm.saturation || 100,
        lightness: vm.lightness || 50
    );
;

并且在 html 上,而不是在 ng-submit 上调用三个方法,只调用一个方法 vm.updateColor,它将对所有三个变量执行 less.modifyVars

Demo Plunkr

【讨论】:

你真是太棒了!非常感谢。你不知道真正看到我想要的颜色有多棒……哈哈! 我觉得我终于要关门了;)

以上是关于如何使用AngularJS动态更新.less文件中的输入值变量的主要内容,如果未能解决你的问题,请参考以下文章

AngularJs 开发app之准备工作2_less

如何使用lessc编译.less文件

CSS没有在AngularJS中动态更新

基于下拉列表中选项的选择动态更新表格的Angularjs代码

AngularJS项目中如何实现按需加载js文件?

如何将文件夹中包含的控制器动态绑定到angularjs中的视图