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 相关文章推荐
如何让动态插入的javascript脚本代码跑起来。
Jan 09 Javascript
Javascript 二维数组
Nov 26 Javascript
避免 showModalDialog 弹出新窗体的原因分析
May 31 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
Apr 11 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
Apr 16 Javascript
form表单只提交数据而不进行页面跳转的解决方案
Sep 18 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
May 12 Javascript
基于jQuery日历插件制作日历
Mar 11 Javascript
js倒计时小实例(多次定时)
Dec 08 Javascript
使用BootStrap实现标签切换原理解析
Mar 14 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
Nov 29 Javascript
vue项目开启Gzip压缩和性能优化操作
Oct 26 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 preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
PHP开发中常用的字符串操作函数
2011/02/08 PHP
PHP动态创建Web站点的方法
2011/08/14 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
php实现搜索类封装示例
2016/03/31 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
form表单传递数组数据、php脚本接收的实例
2017/02/09 PHP
javascript 单选框,多选框美化代码
2008/08/01 Javascript
javascript multibox 全选
2009/03/22 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
vue-resouce设置请求头的三种方法
2017/09/12 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
2018/01/17 Javascript
微信小程序实现提交input信息到后台的方法示例
2019/01/19 Javascript
JavaScript中Object、map、weakmap的区别分析
2020/12/15 Javascript
详解Python3中的Sequence type的使用
2015/08/01 Python
Python实现感知机(PLA)算法
2017/12/20 Python
基于python3 OpenCV3实现静态图片人脸识别
2018/05/25 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
Python中断多重循环的思路总结
2019/10/04 Python
解决python3插入mysql时内容带有引号的问题
2020/03/02 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
会计主管岗位职责范文
2013/11/08 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
班级年度安全计划书
2014/05/01 职场文书
护理目标管理责任书
2014/07/25 职场文书
销售员自我评价
2015/03/11 职场文书
Python中OpenCV实现简单车牌字符切割
2021/06/11 Python
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL
JavaScript 数组去重详解
2021/09/15 Javascript