我的应用程序中有一个颜色名称列表.
let colours = {
  mango: '#e59c09',midnight: '#1476a0'
};

我想扩展ngStyle指令,以便能够理解我的自定义颜色名称.我是在decorating ngStyle指令下做的.但是,我在装饰者的编译功能上遇到了一场艰苦的战斗.我可以访问元素的ngStyle属性,但它是一个字符串(可以理解). JSON.parse()不起作用,因为它不一定是有效的JSON字符串,因为绑定一次等…

我只想介入,迭代所有样式键,如果它包含颜色,我想检查值 – 如果它是上述自定义颜色之一,则替换为十六进制.

我似乎无法访问任何ngStyle内部函数,source code令人困惑和短暂;它似乎只是设置元素CSS – $parse在哪里完成它的工作?例如,当ng-style =“{color:ctrl.textColor}”时 – ngStyle源代码中没有任何内容可以提取ctrl.textColour的值.我在找错了地方吗?

无论如何,如何访问ng样式的键值,以便我可以将自定义颜色更改为其十六进制代码?

这是我在装饰者中到目前为止所得到的:

$provide.decorator('ngStyleDirective',function($delegate) {

    let directive = $delegate[0];
    let link = directive.link;

    directive.compile = function(element,attrs) {

        // Expression here is a string property
        let expression = attrs.ngStyle;

        return function(scope,elem,attr) {

          // How do I iterate over and update style values here?

          // Run original function
          link.apply(this,arguments);

        }

      }

      return $delegate;

});

我尝试使用正则表达式来提取模式等并检查元素,但是,似乎错误的方法来解决问题,因为我必须手动更新字符串并将其传递给基本链接功能.

这是plnkr example.

如果有更好的方法来做我想做的事,请告诉我.

解决方法

Anyway,how do I access ng-style key values so that I can change custom colours to its hex codes please?

可以在compile函数中重写ngStyle属性:

directive.compile = function(element,attrs) {
  let expression = getExpressions(attrs.ngStyle);
  attrs.ngStyle = expression;

  return function(scope,attr) {
    // Run original function
    link.apply(this,arguments);  
  }
}

JSON.parse()来

如果更新HTML以便键被双引号括起来,则可以使用JSON.parse(),这意味着ng-style属性需要用单引号分隔(尽管如果真的想要,可以尝试转义双引号). ..)

<p ng-style='{ "color": "#e59c09" }'>Hello {{name}}!</p>
<p ng-style='{ "padding": "20px 10px","background-color": "#1476a0","color": "#ddd" }'>It is dark here</p>

然后解析该字符串应该产生一个有效的对象,并且可以使用Object.keys()迭代键,检查单词颜色.如果键包含颜色,则可以使用Array.indexOf检查colors数组中是否存在该值.如果它确实存在于数组中,那么String.replace()可用于替换变量的值(即颜色中的键).

function getExpressions(str) {
    var parsed = JSON.parse(str);
    Object.keys(parsed).forEach(function(key) {
        if (key.indexOf('color') > -1) {
            if (Object.keys(colours).indexOf(parsed[key]) > -1) {
                str = str.replace(parsed[key],colours[parsed[key]])
            }
         }
    });
    return str;
}

请参阅下面的示例中演示的内容.顺便说一句,我不得不删除函数getExpressions()范围内声明的未使用的变量颜色,因为它隐藏了对第3行Here is an updated plunker上面定义的变量的访问.

let app = angular.module('plunker',[]);
let colours = {
  mango: '#e59c09',midnight: '#1476a0'
};
app.controller('MainCtrl',function($scope) {
  $scope.name = 'World';
});
app.config(function($provide) {
  // Extract colour values from the string
  function getExpressions(str) {
    var parsed = JSON.parse(str);
    Object.keys(parsed).forEach(function(key) {
      if (key.indexOf('color') > -1) {
        if (Object.keys(colours).indexOf(parsed[key]) > -1) {
          str = str.replace(parsed[key],colours[parsed[key]])
        }
      }
    });
    return str;
  }

  $provide.decorator('ngStyleDirective',function($delegate) {
    let directive = $delegate[0];
    let link = directive.link;

    directive.compile = function(element,attrs) {
      let expression = getExpressions(attrs.ngStyle);
      attrs.ngStyle = expression;
      return function(scope,attr) {
        // Run original function
        link.apply(this,arguments);
      }
    }
    return $delegate;
  });
});
div + div {
  margin-top: 60px;
}

.comment { 
  font-family: courier;
  font-size: 12px;
  margin: 15px 0;
}
<script src="https://code.angularjs.org/1.4.12/angular.js"></script>
<div ng-app="plunker" ng-controller="MainCtrl">
  <div>
    <p class="comment">--- with hex --</p>
    <p ng-style='{ "color": "#e59c09" }'>Hello {{name}}!</p>
    <p ng-style='{ "padding": "20px 10px","color": "#ddd" }'>It is dark here</p>
  </div>

  <div>
    <p class="comment">--- with custom colours --</p>
    <p ng-style='{ "color": "mango" }'>Hello {{name}}!</p>
    <p ng-style='{ "padding": "20px 10px","background-color": "midnight","color": "#ddd" }'>It is dark here</p>
  </div>
</div>

javascript – 如何在装饰器中访问ngStyle键和值?的更多相关文章

  1. Swift设计模式之装饰模式

    转自Swift设计模式原文Design-Patterns-In-Swift

  2. swift设计模式学习 - 装饰模式

    移动端访问不佳,请访问我的个人博客设计模式学习的demo地址,欢迎大家学习交流装饰模式在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。装饰模式的特点装饰对象和真实对象有相同的接口。

  3. php设计模式之装饰模式应用案例详解

    这篇文章主要介绍了php设计模式之装饰模式,结合具体应用案例形式详细分析了php装饰模式的概念、原理、用法及相关操作注意事项,需要的朋友可以参考下

  4. PHP面向对象程序设计组合模式与装饰模式详解

    这篇文章主要介绍了PHP面向对象程序设计组合模式与装饰模式,结合实例形式详细分析了php组合模式与装饰模式的定义、功能、使用方法与相关注意事项,需要的朋友可以参考下

  5. Java设计模式之装饰模式详解

    这篇文章主要介绍了Java设计模式中的装饰者模式,装饰者模式即Decorator Pattern,装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能,装饰模式又名包装模式。装饰器模式以对客户端透明的方式拓展对象的功能,是继承关系的一种替代方案

  6. Angular 4.x FAQ

    个人精力有限,建了个群有兴趣的朋友可以加一下QQ群:Angular修仙之路-153742079一起维护这个FAQ哈!Angular2.x与Angular4.x区别大么?AngularJS1.xDI系统有什么问题?Angular开发AppService时,@Injectable()是必须的么?Angular中使用[innerHtml]时内容被转义了要怎么办?Angular中Provider的作用是什么?Angular中配置Provider有哪几种方式?Angular中宿主元素是什么?Angular中组件如何

  7. 如何在C#中自动生成Decorator模式

    我有一些接口,以及一个实现此接口的类,说:现在,我想创建一个类,用一些特定的逻辑来装饰每个具体的类方法,在非生产环境中,在调用之前和之后执行.我的问题是有一种更简单的方法来自动生成这样的类,而不是在界面上使用反射并创建一个带有cs扩展名的文本文件?解决方法就个人而言,我只需要明确记录需要的地方,但如果你设置使用装饰器这样做,你可以使用RealProxyclass.它可能看起来像这样:

  8. [AngularJS面面观] 24. 依赖注入 --- Value以及Decorator

    和依赖注入关系比较紧密的剩下2个方法分别是value和decorator。所以在provider的构造函数以及config队列定义的任务中可以将constant声明为依赖,但是不可将value声明为依赖。Decorator装饰器算是依赖注入部分最后一个要介绍的概念。顾名思义,装饰器实现了装饰器模式。那么在angular依赖注入这一上下文环境中,装饰器的作用又是什么呢?至此,angular中有关依赖注入的讨论就告一段落了。

  9. angularJS中的核心服务深入理解

    直入正题一.constant服务:app.constant('name',obj)name为服务的名字,obj为一个json对象.js:serviceApp.constant('myConfig',{name:'code_bunny',age:12,getId:function(){return1}});解析constant创建服务返回一个json对象(也就是第二个参数中传入的对象),这个对象里可

  10. Cocos2d-x中应用装饰者模式

    装饰者模式以下情况使用Decorator模式1.需要扩展一个类的功能,或给一个类添加附加职责。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。上边是装饰者模式的应用,今天在做coco2d项目的时候使用了装饰者模式创建场景,觉得大多数的场景创建都适用这种模式。这样把init中的把不同的功能的代码都移到了每个装饰子类中实现,降低耦合性。

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部