Angular1.x自定义指令实例详解


Posted in Javascript onMarch 01, 2017

本文实例讲述了Angular1.x自定义指令。分享给大家供大家参考,具体如下:

调用Module.directive方法,传入指令名称和工厂函数,返回一个对象。

指令名称中每个大写字母会被认为是属性名中的一个独立的词,而每个词之间是以一个连字符分隔的。

var myApp = angular.module('myApp', [])
  .directive("unorderedList", function () {
    return function(scope, element, attrs) {
    };
  });

返回链式函数

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>AngularJS Demo</title>
  <link rel="stylesheet" href="../css/bootstrap.css" rel="external nofollow" />
  <link rel="stylesheet" href="../css/bootstrap-theme.css" rel="external nofollow" >
  <script src="../js/angular.js"></script>
</head>
<body ng-app="myApp" ng-controller="myCtrl">
  <div class="panel panel-default">
    <div class="panel-heading">
      <h3>Products</h3>
    </div>
    <div class="panel-body">
      <div unordered-list="products"></div>
    </div>
  </div>
</body>
<script>
var myApp = angular.module('myApp', [])
  .controller('myCtrl', ["$scope", 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 }
    ];
  }])
  .directive("unorderedList", function () {
    return function (scope, element, attrs) {
      var data = scope[attrs['unorderedList']];
      if( angular.isArray(data) ){
        for(var i=0, len=data.length; i<len; i++){
          console.log(data[i].name);
        }
      }
    };
  });
</script>
</html>

打破对数据属性的依赖

设置一个元素属性,用来动态第设置需要参加运算的键。如果属性名是以data-为前缀的,AngularJS会在生成传给连接函数的属性集合时移除这一前缀。也就是说data-list-property和list-property都会被表示为listProperty。

<div unordered-list="products" list-property="name"></div>
var data = scope[attrs['unorderedList']];
var propertyName = attrs['listProperty'];
if(angular.isArray(data)){
  var listElem = angular.element("<ul>");
  element.append(listElem);
  for(var i=0, len=data.length; i<len; i++){
    listElem.append( angular.element('<li>').text(data[i][propertyName]) );
  }
}

计算表达式

<div unordered-list="products" list-property="price | currency"></div>

添加过滤器后,自定义指令被破坏了。可以让作用域将属性值当做一个表达式进行计算。scope.$eval()接收两个参数:要计算的表达式和需要用于执行该计算的任意本地数据。

listElem.append( angular.element('<li>').text(scope.$eval(propertyName, data[i])) );

处理数据变化

<div class="panel-body">
  <button class="btn btn-primary" ng-click="incrementPrices()">
    Change Prices
  </button>
</div>
$scope.incrementPrices = function () {
  for(var i=0,len = $scope.products.length; i<len; i++){
    $scope.products[i].price++;
  }
}

添加监听器

if(angular.isArray(data)){
  var listElem = angular.element("<ul>");
  element.append(listElem);
  for(var i=0, len=data.length; i<len; i++){
    var itemElem = angular.element('<li>');
    listElem.append(itemElem);
    var watchFn = function (watchScope) {
      return watchScope.$eval(propertyName, data[i]);
    };
    scope.$watch(watchFn, function (newValue, oldValue) {
      itemElem.text(newValue);
    });
  }
}

第一个函数(监听器函数)基于作用域中的数据计算出一个值,该函数在每次作用域发生变化时都会被调用。如果该函数的返回值发生了变化,处理函数就会被调用,这个过程就像字符串表达式方式一样。提供一个函数来监听,能够从容地面对表达式中有可能带有过滤器的数据值得情形。

第二个监听器函数是针对$eval()计算的表达变化,来执行回调函数的。

以上代码并不能正确显示,涉及到for循环闭包问题。

for(var i=0, len=data.length; i<len; i++){
  (function () {
    var itemElem = angular.element('<li>');
    listElem.append(itemElem);
    var index = i;
    var watchFn = function (watchScope) {
      return watchScope.$eval(propertyName, data[index]);
    };
    scope.$watch(watchFn, function (newValue, oldValue) {
      itemElem.text(newValue);
    });
  }());
}

或者

(function (i) {
  var itemElem = angular.element('<li>');
  listElem.append(itemElem);
  var watchFn = function (watchScope) {
    return watchScope.$eval(propertyName, data[i]);
  };
  scope.$watch(watchFn, function (newValue, oldValue) {
    itemElem.text(newValue);
  });
})(i);

jqLite

jqLite中element()append()等方法的参数是HTML string or DOMElement。

return function (scope, element, attrs) {
  var listElem = element.append("<ol>");
  for (var i = 0; i < scope.names.length; i++) {
    listElem.append("<li>").append("<span>").text(scope.names[i]);
  }
}

上述添加的是字符串,最后添加只有scope.names中最后一条信息。

return function (scope, element, attrs) {
  var listElem = angular.element("<ol>");
  element.append(listElem);
  for (var i = 0; i < scope.names.length; i++) {
    listElem.append(angular.element("<li>")
        .append(angular.element("<span>").text(scope.names[i])));
  }
}

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
一些实用的jQuery代码片段收集
Jul 12 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
Aug 30 Javascript
详解JavaScript ES6中的模板字符串
Jul 28 Javascript
基于javascript代码实现通过点击图片显示原图片
Nov 29 Javascript
VUE使用vuex解决模块间传值问题的方法
Jun 01 Javascript
Angular项目从新建、打包到nginx部署全过程记录
Dec 09 Javascript
详解React开发必不可少的eslint配置
Feb 05 Javascript
详解js跨域请求的两种方式,支持post请求
May 05 Javascript
Vue.js 十五分钟入门图文教程
Sep 12 Javascript
Element-ui tree组件自定义节点使用方法代码详解
Sep 17 Javascript
详解Vue调用手机相机和相册以及上传
May 05 Javascript
在layui框架中select下拉框监听更改事件的例子
Sep 20 Javascript
轻松学习Javascript闭包
Mar 01 #Javascript
js图片延迟加载(Lazyload)三种实现方式
Mar 01 #Javascript
node.js实现回调的方法示例
Mar 01 #Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
Mar 01 #Javascript
Angular2库初探
Mar 01 #Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
Mar 01 #Javascript
JavaScript两个变量交换值的实现方法
Mar 01 #Javascript
You might like
php 删除记录同时删除图片文件的实现代码
2010/05/12 PHP
PHP中if和or运行效率对比
2014/12/12 PHP
php利用scws实现mysql全文搜索功能的方法
2014/12/25 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
PHP函数积累总结
2019/03/19 PHP
php面向对象程序设计中self与static的区别分析
2019/05/21 PHP
JavaScript中的console.profile()函数详细介绍
2014/12/29 Javascript
javascript实现框架高度随内容改变的方法
2015/07/23 Javascript
JS操作XML实例总结(加载与解析XML文件、字符串)
2015/12/08 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
JS实现简单的tab切换选项卡效果
2016/09/21 Javascript
Bootstrap table使用方法记录
2017/08/23 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
bootstrap 点击空白处popover弹出框隐藏实例
2018/01/24 Javascript
[原创]jquery判断元素内容是否为空的方法
2018/05/04 jQuery
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
Node.js文本文件BOM头的去除方法
2020/11/22 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
python和C语言混合编程实例
2014/06/04 Python
理解Python中的With语句
2015/02/02 Python
django rest framework 数据的查找、过滤、排序的示例
2018/06/25 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
python实现AES加密解密
2019/03/28 Python
Python图像处理二值化方法实例汇总
2020/07/24 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
机关党员公开承诺书
2014/08/30 职场文书
2014年行政部工作总结
2014/11/19 职场文书
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL
python开发飞机大战游戏
2021/07/15 Python
mysql中整数数据类型tinyint详解
2021/12/06 MySQL
python如何将mat文件转为png
2022/07/15 Python