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 相关文章推荐
随机显示经典句子或诗歌的javascript脚本
Aug 04 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
Oct 23 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
Jun 20 Javascript
JavaScript实现复制功能各浏览器支持情况实测
Jul 18 Javascript
JAVASCRIPT函数作用域和提前声明 分享
Aug 22 Javascript
JQuery与JS里submit()的区别示例介绍
Feb 17 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
Mar 06 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
Oct 09 Javascript
Angular的$http与$location
Dec 26 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
Feb 05 Javascript
JavaScript实现职责链模式概述
Jan 25 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
Oct 31 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
基于PHPExcel的常用方法总结
2013/06/13 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
js prototype截取字符串函数
2010/04/01 Javascript
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
ECMAScript 创建自己的js类库
2012/11/22 Javascript
深入理解javascript严格模式(Strict Mode)
2014/11/28 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
基于jquery实现复选框全选,反选,全不选等功能
2015/10/16 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
文件上传插件SWFUpload的使用指南
2016/11/29 Javascript
详解webpack和webpack-simple中如何引入css文件
2017/06/28 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
2017/10/27 Javascript
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
详解Vue源码之数据的代理访问
2018/12/11 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
VUE路由动态加载实例代码讲解
2019/08/26 Javascript
Python生成pdf文件的方法
2014/08/04 Python
python传递参数方式小结
2015/04/17 Python
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
python中学习K-Means和图片压缩
2017/11/20 Python
python监测当前联网状态并连接的实例
2018/12/18 Python
Django中多种重定向方法使用详解
2019/07/17 Python
python图形用户接口实例详解
2019/12/16 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
2020/02/25 Python
农行实习自我鉴定
2013/09/22 职场文书
酒店管理专业毕业生推荐信
2013/11/10 职场文书
政法大学毕业生自荐信范文
2014/01/01 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
营销学习心得体会
2014/09/12 职场文书
Go 语言中 20 个占位符的整理
2021/10/16 Golang