AngularJS优雅的自定义指令


Posted in Javascript onJuly 01, 2016

学习要点
 •为什么使用指令
 •创建自定义指令
•使用jqLite工作 

一、为什么使用自定义指令
NG内置了许多自定义指令,但是它们有时并不能满足你的要求,这是需要我们创建自定义属性。

二、自定义指令
接下来,我们来做一个小案例,当鼠标单击加价后,列表项自动递增,当然列表也是通过指令自动添加的,它本就是一个空的div

<!DOCTYPE>
<!-- use module -->
<html ng-app="exampleApp">
<head>
  <title>Angluar test</title>
  <meta charset="utf-8"/>
  <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
  <link rel="stylesheet" type="text/css" href="css/bootstrap-theme.min.css">
</head>
<body>
  <dlv class="panel panel-default" ng-controller="defaultCtrl">
    <div class="panel-heading">
       <h3>Products</h3>
    </div>
    <div class="panel-body">
      <!-- 点击加价,价格递增 -->
      <button type="button" class="btn btn-primary" ng-click="incrementPrices()">加价</button>
    </div>
    <div class="panel-body">
      <!-- 将products数据以一种无序列表的形式展示 -->
      <!-- list-property="price | currency" 列表项单位本地化 -->
      <div unorderlist="products" list-property="price | currency"></div>
    </div>
  </dlv>

<script type="text/javascript" src="js/angular.min.js"></script>

<script type="text/javascript">

angular.module("exampleApp", [])
  .directive("unorderlist", function () {
    // scope 作用域
    // element 应用该指令的元素
    // attrs 使用该指令的元素的属性
    return function (scope, element, attrs) {
      // attrs['unorderlist'] 获取unorderlist属性值,这里为products
      // 获取数据模型值,这里为scope.products
      var data = scope[attrs['unorderlist']];
      // 创建一个<ul>标签元素
      var ul = angular.element("<ul>");
      // 在应用该指令的元素中添加<ul>
      element.append(ul);
      // 获取listProperty属性值,这里为price | currency
      var expression = attrs['listProperty'];
      // 判断是否为数组
      if (angular.isArray(data)) {
        // 遍历数据模型scope.products
        for (var i = 0; i < data.length; i++) {
          // 添加闭包,将i传递进去
          (function (index) {
            // 创建一个<li>标签元素
            var li = angular.element("<li>");
            // 将<li>标签添加到<ul>中
            ul.append(li);
            // 监听器函数,用$eval计算表达式和data[index]的值
            var watcherFn = function (watchScope) {
              return watchScope.$eval(expression, data[index]);
            }
            // 添加$watch监听器监听作用域的变化
            scope.$watch(watcherFn, function (newValue, oldValue) {
              // 更新li的值
              li.text(newValue);
            })
          })(i);
        }
      }
    }
  })
  .controller("defaultCtrl", function ($scope) {
    // 数据模型
    $scope.products = [
      { name: "Apples", category: "Fruit", price: 1.20, expiry: 10 },
      { name: "Bananas", category: "Fruit", price: 2.42, expiry: 7 },
      { name: "Pears", category: "Fruit", price: 2.02, expiry: 6 }
    ];
    // 递增价格
    $scope.incrementPrices = function () {
      for (var i = 0; i < $scope.products.length; i++) {
        $scope.products[i].price++;
      }
    }
  })
</script>
</body>
</html>

解析:
第一步:创建控制器,添加数据模型products和递增价格incrementPrices()方法
第二步:自定义unorderlist标签,该标签的作用是:通过作用域数据模型的值,将其值以无序列表的方式展示出来
第三部:并且在单击加价按钮时,无序列表的值会依次递增

AngularJS优雅的自定义指令

三、使用jqLite工作
NG内置了jqLite,它是JQuery的缩小版

<!DOCTYPE>
<!-- use module -->
<html ng-app="exampleApp">
<head>
  <title>Angluar test</title>
  <meta charset="utf-8"/>
  <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
  <link rel="stylesheet" type="text/css" href="css/bootstrap-theme.min.css">
</head>
<body>
  <dlv class="panel panel-default">
    <!-- 使用自定义指令 -->
    <ol dome-directive>
      <li>Apples</li>
      <ul>
        <li>Bananas</li>
        <li>Cherries</li>
        <li>Oranges</li>
      </ul>
      <li>Pears</li>
      <li>Oranges</li>
    </ol>
  </dlv>
<script type="text/javascript" src="js/angular.min.js"></script>
<script type="text/javascript">
angular.module("exampleApp", [])
  .directive("domeDirective", function () {
    return function (scope, element, attrs) {
      // 找出element元素下所有的li,这里的element是调用者<ol>
      var items = element.find("li");
      // 要所有的li的font-weight为bold
      items.css("font-weight", "bold");
      // 遍历li, 值为Oranges的字体颜色为red,其余为green
      for (var i = 0; i < items.length; i++) {
        if (items.eq(i).text() == "Oranges"){
          items.eq(i).css("color", "red");
        } else {
          items.eq(i).css("color", "green");
        }
      }
      // 打印出li的长度和字体颜色
      console.log("Items length : " + items.length);
      console.log("Color: " + items.css("color"));
    }
  })
</script>
</body>
</html>

解析:
第一步:自定义控制器,定义数据模型names
第二步:自定义指令,功能是将使用指令的元素下的所有li找出,并且更加值的不同赋给字体不同的颜色
第三步:在视图中调用并且使用指令

AngularJS优雅的自定义指令

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery用于查询操作的实现代码
May 10 Javascript
jquery在Chrome下获取图片的长宽问题解决
Mar 20 Javascript
JavaScript限定复选框的选择个数示例代码
Aug 25 Javascript
javascript相等运算符与等同运算符详细介绍
Nov 09 Javascript
javascript随机之洗牌算法深入分析
Jun 07 Javascript
编写简单的jQuery提示插件
Dec 21 Javascript
JQuery悬停控制图片轮播——代码简单
Aug 05 Javascript
EasyUI学习之DataGird分页显示数据
Dec 29 Javascript
vuejs如何配置less
Apr 25 Javascript
js实现搜索栏效果
Nov 16 Javascript
vue-cli3配置与跨域处理方法
Aug 17 Javascript
Vue中使用JsonView来展示Json树的实例代码
Nov 16 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
Jul 01 #Javascript
再谈Javascript中的基本类型和引用类型(推荐)
Jul 01 #Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
Jul 01 #Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
Jul 01 #Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
Jul 01 #Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
Jul 01 #Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
Jul 01 #Javascript
You might like
用PHP编写PDF文档生成器
2006/10/09 PHP
php 购物车完整实现代码
2014/06/05 PHP
php实现递归与无限分类的方法
2015/02/16 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
JavaScript DOM学习第四章 getElementByTagNames
2010/02/19 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
浅谈javascript中自定义模版
2015/01/29 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
微信浏览器禁止页面下拉查看网址实例详解
2017/06/28 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
[01:52]深扒TI7聊天轮盘语音出处7
2017/05/11 DOTA
python逆向入门教程
2018/01/15 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
python实现根据指定字符截取对应的行的内容方法
2018/10/23 Python
Python匿名函数及应用示例
2019/04/09 Python
Python3内置模块random随机方法小结
2019/07/13 Python
pandas factorize实现将字符串特征转化为数字特征
2019/12/19 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
Python如何将装饰器定义为类
2020/07/30 Python
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
国际政治个人自荐信范文
2013/11/26 职场文书
共产党员公开承诺践诺书
2014/05/28 职场文书
倡议书格式
2014/08/30 职场文书
2015年爱牙日活动总结
2015/03/23 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
数据库之SQL技巧整理案例
2021/07/07 SQL Server