搞定angular1.x——自定义指令

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

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

  1. var myApp = angular.module('myApp', [])
  2.     .directive("unorderedList", function () {
  3.         return function(scope, element, attrs) {
  4.     
  5.         };
  6.     });

返回链式函数

  1.  lang="en">
  2.      charset="UTF-8">
  3.     </span><span class="pln" style="line-height:20px;overflow:hidden;color:rgb(56,138,247);">AngularJS Demo</span><span class="tag" style="line-height:20px;overflow:hidden;color:rgb(30,52,123);">
  4.      rel="stylesheet" href="../css/bootstrap.css" />
  5.      rel="stylesheet" href="../css/bootstrap-theme.css">
  6.      src="../js/angular.js">
  7.  ng-app="myApp" ng-controller="myCtrl">
  8.  
  9.      class="panel panel-default">
  10.          class="panel-heading">
  11.             

    Products

  12.         
  •          class="panel-body">
  •              unordered-list="products">
  •         
  •     
  •  
  •  
  •  打破对数据属性的依赖

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

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

    计算表达式

    1.  unordered-list="products" list-property="price | currency">
            

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

    1. listElem.append( angular.element('
    2. ').text(scope.$eval(propertyName, data[i])) );

    处理数据变化

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

    添加监听器

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

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

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

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

    1. for(var i=0, len=data.length; i<len; i++){
    2.     (function () {
    3.         var itemElem = angular.element('
    4. ');
    5.         listElem.append(itemElem);
    6.         var index = i;
    7.         var watchFn = function (watchScope) {
    8.             return watchScope.$eval(propertyName, data[index]);
    9.         };
    10.  
    11.         scope.$watch(watchFn, function (newValue, oldValue) {
    12.             itemElem.text(newValue);
    13.         });
    14.     }());
    15. }

     或者

    1. (function (i) {
    2.     var itemElem = angular.element('
    3. ');
    4.     listElem.append(itemElem);
    5.  
    6.     var watchFn = function (watchScope) {
    7.         return watchScope.$eval(propertyName, data[i]);
    8.     };
    9.  
    10.     scope.$watch(watchFn, function (newValue, oldValue) {
    11.         itemElem.text(newValue);
    12.     });
    13. })(i);

     jqLite

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

    1. return function (scope, element, attrs) {
    2.     var listElem = element.append("
        ");
      1.     for (var i = 0; i < scope.names.length; i++) {
      2.         listElem.append("
      3. ").append("").text(scope.names[i]);
      4.     }
      5. }       

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

       
        
      1. return function (scope, element, attrs) {
      2.     var listElem = angular.element("
          ");
        1.     element.append(listElem);
        2.     for (var i = 0; i < scope.names.length; i++) {
        3.         listElem.append(angular.element("
        4. ")
        5.                 .append(angular.element("").text(scope.names[i])));
        6.     }
        7. }

    你可能感兴趣的:(angularjs)