最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Angular1.x復(fù)雜指令實(shí)例詳解

 更新時(shí)間:2017年03月01日 14:25:10   作者:stavencsdn  
這篇文章主要介紹了Angular1.x復(fù)雜指令,結(jié)合實(shí)例形式分析了指令的使用、模板指令、指令的作用域等概念與具體使用技巧,需要的朋友可以參考下

本文實(shí)例講述了Angular1.x復(fù)雜指令。分享給大家供大家參考,具體如下:

名稱

描述

compile

指定一個(gè)編譯函數(shù)

controller

為指令創(chuàng)建一個(gè)控制器函數(shù)

link

為指令指定鏈接函數(shù)

replace

指定模板內(nèi)容是否替換指令所應(yīng)用到的元素

require

聲明對(duì)某個(gè)控制器的依賴

restrict

指定指令如何使用ACEM

scope

為指令創(chuàng)建一個(gè)新的作用域或者一個(gè)隔離的作用域

template

指定一個(gè)將被插入到HTML文檔的模板

templateUrl

指定一個(gè)將被插入到HTML文檔的外部模板

transclude

指定指令是否被用于包含任意內(nèi)容


.directive('unorderedList', function () {
  return {
    link: function (scope, element, attrs) {
      var data = scope[attrs['unorderedList'] || attrs['listSource'] ];
      var propertyName = attrs['listProperty'] || "price || currency";
      if(angular.isArray(data)){
        var listElem = angular.element("<ul>");
        if(element[0].nodeName == "#comment"){
          element.parent().append(listElem);
        }else{
          element.append(listElem);
        }
        for(var i=0, len=data.length; i<len; i++){
          var itemElem = angular.element('<li>').text(scope.$eval(propertyName, data[i]));
          listElem.append(itemElem);
        }
      }
    },
    restrict:'EACM'
  };
});

如何使用指令

當(dāng)作元素使用(E)

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

當(dāng)unordered-list當(dāng)作元素使用,需要添加另外的屬性代替unordered-list屬性的作用。

var data = scope[attrs['unorderedList'] || attrs['listSource'] ];

當(dāng)作屬性使用(A)

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

當(dāng)作類的屬性值使用(C)

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

當(dāng)作注釋使用(M)

<!-- directive: unordered-list products -->

使用模板指令

.directive('unorderedList', function () {
  return {
    link: function (scope, element, attrs) {
      scope.data = scope[attrs['unorderedList']];
    },
    restrict: 'A',
    template:"<ul><li ng-repeat='item in data'>{{item.price | currency}}</li></ul>"
  };
});

使用函數(shù)作為模板

template屬性除了使用字符串,也可以指定一個(gè)函數(shù)來生成模板化的內(nèi)容。該函數(shù)傳入兩個(gè)函數(shù)(指令所應(yīng)用到的元素以及屬性集合)并返回將被插入到文檔中的HTML代碼片段。

<script type="text/javascript" id="listTemplate">
  <ul>
    <li ng-repeat="item in data">{{item.price | currency}}</li>
  </ul>
</script>
<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 {
        link: function (scope, element, attrs) {
          scope.data = scope[attrs['unorderedList']];
        },
        restrict: 'A',
        template:function () {
          return angular.element(
              document.querySelector("#listTemplate")
          ).html();
        }
      };
    });
</script>

使用外部模板

itemTemplate.html

<p>This is the form the template file</p>
<ul>
  <li ng-repeat="item in data">{{item.price | currency}}</li>
</ul>

.directive('unorderedList', function () {
  return {
    link: function (scope, element, attrs) {
      scope.data = scope[attrs['unorderedList']];
    },
    restrict: 'A',
    templateUrl:"itemTemplate.html"
  };
});

通過函數(shù)選擇一個(gè)外部模版

tableTemplate.html

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Price</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in data">
      <td>{{item.name}}</td>
      <td>{{item.price | currency}}</td>
    </tr>
  </tbody>
</table>

<div unordered-list="products" template="table" class="table table-striped">
  This is where the list will go
</div>

.directive('unorderedList', function () {
  return {
    link: function (scope, element, attrs) {
      scope.data = scope[attrs['unorderedList']];
    },
    restrict: 'A',
    templateUrl: function (elem, attrs) {
      return attrs['template'] == "table" ? "tableTemplate.html" : "itemTemplate.html";
    }
  };
});

table-striped樣式并沒有起作用,設(shè)置replace屬性為true后的效果是模版內(nèi)容將替換掉指令所應(yīng)用到的div元素。

管理指令的作用域

為每個(gè)指令實(shí)例創(chuàng)建自己的作用域

設(shè)置scope屬性為true將允許我們?cè)谕粋€(gè)控制器里復(fù)用這個(gè)指令,可以避免指令共享數(shù)據(jù)值。

<div class="panel panel-default">
  <div class="panel-body" scope-demo></div>
  <div class="panel-body" scope-demo></div>
</div>

var myApp = angular.module('myApp', [])
.controller('myCtrl', ["$scope", function ($scope) {
  $scope.data = {name:"Staven"};
  $scope.city = "China"
}])
.directive('scopeDemo', function () {
  return {
    template: function () {
      return angular.element(document.querySelector("#scopeTemplate")).html();
    },
    scope:true
  };
});

data.name這個(gè)屬性是在一個(gè)對(duì)象上定義的,意味著這個(gè)值將會(huì)在指令的哥哥實(shí)例之間所共享,而且所有相應(yīng)的視圖會(huì)同步更新。

city是直接在控制器的作用于上被直接賦值的,意味著這個(gè)值只在此指令的作用域上有效。

創(chuàng)建隔離的作用域

對(duì)于在一個(gè)對(duì)象上定義的屬性,可能會(huì)被其他人改變。解決方法就是創(chuàng)建一個(gè)隔離的作用域,就是Angularjs為指令的每個(gè)實(shí)例創(chuàng)建一個(gè)獨(dú)立的作用域的地方,但是這個(gè)作用域并不繼承自控制器的作用域。當(dāng)scope定義屬性被設(shè)置為一個(gè)對(duì)象時(shí),可創(chuàng)建一個(gè)隔離的作用域。隔離的作用域的最基本類型是用一個(gè)沒有屬性的對(duì)象表示。

.directive('scopeDemo', function () {
  return {
    template: function () {
      return angular.element(document.querySelector("#scopeTemplate")).html();
    },
    scope:{}
  };
});

當(dāng)創(chuàng)建在不同情況下復(fù)用的指令時(shí),隔離的作用域是一種重要的構(gòu)件時(shí)。因?yàn)樗乐沽嗽诳刂破髯饔糜蚝椭噶钪g出現(xiàn)了意料外的交互。但是完全隔絕一個(gè)指令會(huì)使得難以輸入和輸出數(shù)據(jù)。

隔絕的作用域允許使用應(yīng)用于指令旁邊的元素上的屬性將數(shù)據(jù)值綁定到控制器作用域上。

單向綁定@:

向以@為前綴的作用域?qū)ο笊显鎏硪粋€(gè)屬性,以在一個(gè)隔離的作用力創(chuàng)建一個(gè)單向綁定。

<body ng-app="myApp" ng-controller="myCtrl">
  <div class="panel panel-default">
    <div class="panel-body">
      Direct Binding:<input ng-model="data.name" />
    </div>
    <div class="panel-body" scope-demo nameprop="{{data.name}}"></div>
  </div>
</body>
<script type="text/ng-template" id="scopeTemplate">
  <div class="panel-body">
    <p>Data Value:{{local}}</p>
  </div>
</script>
<script>
var myApp = angular.module('myApp', [])
.controller('myCtrl', ["$scope", function ($scope) {
  $scope.data = {name:"staven"};
}])
.directive('scopeDemo', function () {
  return {
    template: function () {
      return angular.element(document.querySelector("#scopeTemplate")).html();
    },
    scope:{
      local:"@nameprop"
    }
  };
});
</script>

local屬性的值以@為前綴,制定了屬性local的值應(yīng)該從一個(gè)來自名為nameprop的特性的單向綁定來獲得。

使用一個(gè)隔離的作用域使得指令不會(huì)繼承控制器作用域中的數(shù)據(jù)。

雙向綁定=:

向以=為前綴的作用域?qū)ο笊显鎏硪粋€(gè)屬性,以在一個(gè)隔離的作用域里創(chuàng)建一個(gè)雙向綁定。

在隔離作用于上的單向綁定總是被計(jì)算作字符串值,如果想訪問一個(gè)數(shù)組,就必須使用雙向綁定。

<div class="panel panel-default">
  <div class="panel-body">
    Direct Binding:<input ng-model="data.name" />
  </div>
  <div class="panel-body" scope-demo nameprop="data.name"></div>
</div>
<script type="text/ng-template" id="scopeTemplate">
  <div class="panel-body">
    <p>Data Value:<input ng-model="local" /></p>
  </div>
</script>
<script>
  scope:{
    local:"=nameprop"
  }
</script>

使用單向綁定時(shí),提供了一個(gè)被"{{"和"}}"字符所包圍的綁定表達(dá)式,但是angularjs需要知道在雙向綁定中哪個(gè)屬性需要被更新,所以不需要被"{{"和"}}"包圍。

計(jì)算表達(dá)式&:

向以&為前綴的作用域?qū)ο笊显鎏硪粋€(gè)屬性,在父作用域的上下文計(jì)算一個(gè)表達(dá)式。

<body ng-app="myApp" ng-controller="myCtrl">
<div class="panel panel-default">
  <div class="panel-body">
    Direct Binding:<input ng-model="data.name" />
  </div>
  <div class="panel-body" scope-demo city="getCity(data.name)" nameprop="data.name"></div>
</div>
</body>
<script type="text/ng-template" id="scopeTemplate">
  <div class="panel-body">
    <p>Name:{{local}}, City:{{cityFn()}}</p>
  </div>
</script>
<script>
var myApp = angular.module('myApp', [])
.controller('myCtrl', ["$scope", function ($scope) {
  $scope.data = {name:"staven",defaultCity:"hefei"};
  $scope.getCity = function (name) {
    console.log(1);
    return name == 'staven' ? $scope.data.defaultCity : "Unknown";
  }
}])
.directive('scopeDemo', function () {
  return {
    template: function () {
      return angular.element(document.querySelector("#scopeTemplate")).html();
    },
scope:{
  local:"=nameprop",
  cityFn:"&city"
}
  };
});
</script>

調(diào)用cityFn()時(shí),使用了圓括號(hào),要計(jì)算被這個(gè)特性所指定的表達(dá)式,這是必需的,即使當(dāng)表達(dá)式本身就是一個(gè)函數(shù)調(diào)用時(shí)。

使用隔離作用域的數(shù)據(jù)來計(jì)算一個(gè)表達(dá)式

可以將來自代計(jì)算的隔離作用域的數(shù)據(jù)為控制器作用域表達(dá)式的一部分。

<div class="panel-body" scope-demo city="getCity(nameVal)" nameprop="data.name"></div>
<script type="text/ng-template" id="scopeTemplate">
  <div class="panel-body">
    <p>Name:{{local}}, City:{{cityFn({nameVal: local})}}</p>
  </div>
</script>

更多關(guān)于AngularJS相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《AngularJS指令操作技巧總結(jié)》、《AngularJS入門與進(jìn)階教程》及《AngularJS MVC架構(gòu)總結(jié)

希望本文所述對(duì)大家AngularJS程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 詳解angularjs結(jié)合pagination插件實(shí)現(xiàn)分頁(yè)功能

    詳解angularjs結(jié)合pagination插件實(shí)現(xiàn)分頁(yè)功能

    本篇文章主要介紹了詳解angularjs結(jié)合pagination插件實(shí)現(xiàn)分頁(yè)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • angularJS 指令封裝回到頂部示例詳解

    angularJS 指令封裝回到頂部示例詳解

    本篇文章主要介紹了angularJS 指令封裝回到頂部示例詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • Angular中管道操作符(|)的使用方法

    Angular中管道操作符(|)的使用方法

    通常我們需要使用管道實(shí)現(xiàn)對(duì)數(shù)據(jù)的格式化,下面這篇文章主要給大家介紹了關(guān)于Angular中管道操作符(|)的使用方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • AngularJs動(dòng)態(tài)加載模塊和依賴注入詳解

    AngularJs動(dòng)態(tài)加載模塊和依賴注入詳解

    這篇文章主要為大家介紹了AngularJs動(dòng)態(tài)加載模塊和依賴注入,感興趣的小伙伴們可以參考一下
    2016-01-01
  • AngularJS入門教程之過濾器詳解

    AngularJS入門教程之過濾器詳解

    本文主要講解AngularJS 過濾器,這里整理了過濾器的相關(guān)資料并附示例代碼,幫助大家學(xué)習(xí)AngularJS的知識(shí),有需要的小伙伴可以參考下
    2016-08-08
  • AngularJS學(xué)習(xí)筆記之表單驗(yàn)證功能實(shí)例詳解

    AngularJS學(xué)習(xí)筆記之表單驗(yàn)證功能實(shí)例詳解

    這篇文章主要介紹了AngularJS學(xué)習(xí)筆記之表單驗(yàn)證功能,結(jié)合實(shí)例形式分析了AngularJS針對(duì)表單的校驗(yàn)、監(jiān)控等相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • Angularjs 動(dòng)態(tài)添加指令并綁定事件的方法

    Angularjs 動(dòng)態(tài)添加指令并綁定事件的方法

    本篇文章主要介紹了Angularjs 動(dòng)態(tài)添加指令并綁定事件的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • 利用require.js與angular搭建spa應(yīng)用的方法實(shí)例

    利用require.js與angular搭建spa應(yīng)用的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于利用require.js與angular搭建spa應(yīng)用的方法實(shí)例,文中通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的理解和學(xué)習(xí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起看看吧。
    2017-07-07
  • angular簡(jiǎn)介和其特點(diǎn)介紹

    angular簡(jiǎn)介和其特點(diǎn)介紹

    這篇文章主要介紹了angular簡(jiǎn)介和其特點(diǎn)介紹,本文講解了關(guān)于和jquery的比較、關(guān)于適用場(chǎng)合、關(guān)于UI的結(jié)合、關(guān)于angularjs的特點(diǎn)等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • Angular項(xiàng)目如何使用攔截器?httpClient?請(qǐng)求響應(yīng)處理

    Angular項(xiàng)目如何使用攔截器?httpClient?請(qǐng)求響應(yīng)處理

    這篇文章主要介紹了Angular項(xiàng)目簡(jiǎn)單使用攔截器httpClient請(qǐng)求響應(yīng)處理,目前我的Angular版本是Angular?17.3,版本中實(shí)現(xiàn)請(qǐng)求和響應(yīng)的攔截處理了,這種機(jī)制非常適合添加如身份驗(yàn)證頭、錯(cuò)誤統(tǒng)一處理、日志記錄等功能,需要的朋友可以參考下
    2024-06-06

最新評(píng)論

文水县| 包头市| 牟定县| 开远市| 东乡族自治县| 都兰县| 剑阁县| 边坝县| 河北区| 吉水县| 克什克腾旗| 阜新市| 勃利县| 友谊县| 锡林郭勒盟| 张北县| 高雄县| 壶关县| 香格里拉县| 绥中县| 南投县| 绥德县| 定结县| 资溪县| 长垣县| 福贡县| 繁峙县| 酒泉市| 安康市| 南靖县| 申扎县| 牙克石市| 泗洪县| 大新县| 禹城市| 龙游县| 克拉玛依市| 万盛区| 武强县| 织金县| 长海县|