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 prototype 使用介绍
Aug 29 Javascript
JavaScript SetInterval与setTimeout使用方法详解
Nov 15 Javascript
Javascript玩转继承(二)
May 08 Javascript
JavaScript获取元素尺寸和大小操作总结
Feb 27 Javascript
在Javascript中处理数组之toSource()方法的使用
Jun 09 Javascript
jQuery下拉美化搜索表单效果代码分享
Aug 25 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
May 10 Javascript
js通过指定下标或指定元素进行删除数组的实例
Jan 12 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
Jan 20 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
Apr 22 Javascript
Angular PWA使用的Demo示例
Jan 31 Javascript
iSlider手机端图片滑动切换插件使用详解
Dec 24 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访问查询mysql数据的三种方法
2006/10/09 PHP
PHP图片上传类带图片显示
2006/11/25 PHP
PHP SQLite类
2009/05/07 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
基于php实现的验证码小程序
2016/12/13 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
2018/05/16 PHP
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
简单实用jquery版三级联动select示例
2013/07/04 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
浅谈NodeJS中require路径问题
2015/05/07 NodeJs
jQuery幻灯片带缩略图轮播效果代码分享
2015/08/17 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
2017/02/17 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
纯js代码生成可搜索选择下拉列表的实例
2018/01/11 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
jQuery pagination分页示例详解
2018/10/23 jQuery
如何解决django配置settings时遇到Could not import settings 'conf.local'
2014/11/18 Python
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
python 实现dict转json并保存文件
2019/12/05 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
体育专业个人求职信范文
2013/12/27 职场文书
农村改厕实施方案
2014/03/22 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
在职人员跳槽求职信
2015/03/20 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
个人销售励志奋斗口号
2019/12/05 职场文书