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 相关文章推荐
js 解决“options为空或不是对象”
Dec 22 Javascript
Javascript 刷新全集常用代码
Nov 22 Javascript
js弹窗返回值详解(window.open方式)
Jan 11 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
Jun 03 Javascript
javascript实现删除前弹出确认框
Jun 04 Javascript
基于jQuery实现左侧菜单栏可折叠功能
Dec 27 Javascript
JavaScript递归算法生成树形菜单
Aug 15 Javascript
p5.js入门教程和基本形状绘制
Mar 15 Javascript
详解Vue-axios 设置请求头问题
Dec 06 Javascript
layer.prompt输入层的例子
Sep 24 Javascript
通过实例解析json与jsonp原理及使用方法
Sep 27 Javascript
Javascript执行上下文顺序的深入讲解
Nov 04 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传输数据的代码
2007/11/13 PHP
php面向对象全攻略 (五) 封装性
2009/09/30 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
10条php编程小技巧
2015/07/07 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
PHP重载基础知识回顾
2020/09/10 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
JS通过相同的name进行表格求和代码
2013/08/18 Javascript
jquery遍历checkbox介绍
2014/02/21 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
vue-cli中的webpack配置详解
2017/09/25 Javascript
JS实现的获取银行卡号归属地及银行卡类型操作示例
2019/01/08 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
Python实现端口复用实例代码
2014/07/03 Python
python中使用mysql数据库详细介绍
2015/03/27 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
Python类的继承和多态代码详解
2017/12/27 Python
python发送告警邮件脚本
2018/09/17 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
20行python代码实现人脸识别
2019/05/05 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
pytorch::Dataloader中的迭代器和生成器应用详解
2020/01/03 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
美国休闲服装品牌:Express
2016/09/24 全球购物
机电一体化毕业生求职信
2013/11/02 职场文书
小学记事作文之200字
2019/08/06 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android