91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

angular中自定義指令的示例分析

發布時間:2021-08-04 14:15:00 來源:億速云 閱讀:152 作者:小新 欄目:web開發

這篇文章將為大家詳細講解有關angular中自定義指令的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

自定義屬性的四種類別

分為: 元素E,屬性A,注釋M,類C , 分別如下:

 <my-dir></my-dir>
 <span my-dir="exp"></span>
 <!-- directive: my-dir exp -->
 <span class="my-dir: exp;"></span>

簡單創建一個指令

html結構:

<div ng-controller="myCtrl">
 <div my-customer></div>
</div>

JavaScript結構:

angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope) {
   $scope.customer = {
    name: 'Naomi',
    address: '1600 Amphitheatre'
   };
  }])
  .directive('myCustomer', function() {
   return {
    template: 'Name: {{customer.name}} Address: {{customer.address}}'
   };
  });

輸出:

Name: Naomi Address: 1600 Amphitheatre

說明: 此處,myCtrl 中定義的 $scope.customer 屬性和屬性值都在指令中的模板使用了。同樣的,在指令return 對象中的 template 也可被替換成一路徑,在路徑html中書寫和template中同樣的代碼,使用這種方式,可以操作更多代碼。

templateUrl 函數式編程

html結構:

<div ng-controller="myCtrl">
  <div my-customer></div>
</div>

javascript結構:

 angular.module('myApp', [])
 .controller('myCtrl', ['$scope', function($scope) {
  $scope.customer = {
   name: 'Naomi',
   address: '1600 Amphitheatre'
  };
   }])
 .directive('myCustomer', function() {
  return {
   templateUrl: function(elem, attr) {
    return 'customer-' + attr.type + '.html';
   }
  };
 });

不同的templateUrl ①

 Name: {{customer.name}}

不同的templateUrl ②

 Address: {{customer.address}}

輸出結果:

Name: Naomi
Address: 1600 Amphitheatre

說明: templateUrl 的值可以是一個函數返回值,返回用于指令中的html模板的url。

隔離指令的作用域

① 通過不同的controller

html結構:

<div ng-app="myApp">
  <div ng-controller="myCtrl1">
    <my-customer></my-customer>
  </div>
  <div ng-controller="myCtrl2">
    <my-customer></my-customer>
  </div>
</div>

javascript結構:

angular.module('myApp', [])
  .controller('myCtrl1', ['$scope', function($scope) {
   $scope.customer = {
    name: 'Naomi',
    address: '1600 Amphitheatre'
   };
  }])
  .controller('myCtrl2', ['$scope', function($scope) {
   $scope.customer = {
    name: 'Igor',
    address: '123 Somewhere'
   };
  }])
  .directive('myCustomer', function() {
   return {
    restrict: 'E',
    templateUrl: 'my-customer.html'
   };
  });

templateUrl html 結構:

 Name: {{customer.name}} Address: {{customer.address}}

輸出結果:

 Name: Naomi Address: 1600 Amphitheatre
 Name: Igor Address: 123 Somewhere

說明: 可見 不同的controller 有不同的作用范圍。雖然指令一樣,每次渲染都是分離的,所以我們可以抽象出來指令,用于html模板和代碼的重用,封裝。但是這樣又不是很好,因為用了兩個controller,我們可以使用指令中的scope而不是controller里的scope來替代,具體做法是將外部的scope 映射到指令內部的scope, 如下:

② 通過指令屬性映射scope

html結構:

<div ng-app="myApp" ng-controller="myCtrl">
 <my-customer info="naomi"></my-customer>
 <my-customer info="igor"></my-customer>
</div>

javascript 結構:

 angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope) {
   $scope.naomi = { name: 'Naomi', address: '1600 Amphitheatre' };
   $scope.igor = { name: 'Igor', address: '123 Somewhere' };
  }])
  .directive('myCustomer', function() {
   return {
    restrict: 'E',
    scope: {
     customerInfo: '=info'
    },
    templateUrl: 'my-customer-iso.html'
   };
  });

templateUrl html結構:

Name: {{customerInfo.name}} Address: {{customerInfo.address}}

編譯后的html結果:

 Name: Naomi Address: 1600 Amphitheatre
 Name: Igor Address: 123 Somewhere

③ 指令中的如果定義scope屬性則html中的scope不會直接繼承controller中的scope,在html中使用的都需要在scope:{}中聲明,否則就是undefined

html 結構:

 <div ng-app="myApp" ng-controller="myCtrl">
   <my-customer info="naomi"></my-customer>
 </div>

javascript結構:

 angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope) {
   $scope.naomi = { name: 'Naomi', address: '1600 Amphitheatre' };
   $scope.vojta = { name: 'Vojta', address: '3456 Somewhere Else' };
  }])
  .directive('myCustomer', function() {
   return {
    restrict: 'E',
    scope: {
     customerInfo: '=info'
    },
    templateUrl: 'my-customer-plus-vojta.html'
   };
  });

  templateUrl html結構:

Name: {{customerInfo.name}} Address: {{customerInfo.address}}
<br>
Name: {{vojta.name}} Address: {{vojta.address}}

html編譯后的結果:

Name: Naomi Address: 1600 Amphitheatre
Name: Address:

說明: vojta 在指令中的scope沒有被定義,不會直接繼承在controller中的,那么他就是undefined,所以就是空白(什么都不顯示)

可操作DOM的指令

創建一個用于操作dom的指令,如果需要dom操作也都應該放在指令里。

html 結構:

 <div ng-app="myApp" ng-controller="myCtrl">
  Date format: <input ng-model="format"> <hr/>
  Current time is: <span my-current-time="format"></span>
 </div>

javascript結構:

angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope) {
    $scope.format = 'M/d/yy h:mm:ss a';
  }])
  .directive('myCurrentTime', function($interval, dateFilter) {
    return {
     restrict: 'AE',
     link: function(scope, element, attr){
       var format, timeoutId;

      /* 更新時間函數 */
      function updateTime() {
       element.text(dateFilter(new Date(), format));
      }

      /* 監視時間格式的改變 */
      var attrWatch = scope.$watch(attrs.myCurrentTime, function(value) {
       format = value;
       updateTime();
      });

      /* 定時器 */
      timeoutId = $interval(function() {
       updateTime(); // update DOM
      }, 1000);

      /* 頁面跳轉后移除定時器防止內存泄露 */
      element.on('$destroy', function() {
       $interval.cancel(timeoutId);
       attrWatch(); // 移除watch
      });
    }
   };
  });

說明: 在link函數中,操作dom節點,讓dom的文本節點動態顯示時間跳動。在頁面跳轉之后及時清除定時器和監視器以免發生內存泄漏。

通過transclude和ng-transclude創建可包裹其他元素的指令

html結構:

 <div ng-app="myApp" ng-controller="myCtrl">
   <my-dialog>Check out the contents, {{name}}!</my-dialog>
 </div>

javascript結構:

 angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope) {
    $scope.name = 'Tobias';
  }])
  .directive('myDialog', function() {
   return {
    restrict: 'E',
    transclude: true,
    scope: {},
    templateUrl: 'my-dialog.html',
    link: function(scope) {
      scope.name = 'Jeff';
    }
 };
});

templateUrl html 結構:

 <div class="alert" ng-transclude></div>

編譯后的html結構:

Check out the contents, Tobias!

說明: 指令中的scope本應隔離controller中的作用域的,但是由于設置了transclude=true選項,scope就會繼承controller中的定義,所以最終是Tobias而不是Jeff。

關于“angular中自定義指令的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

白银市| 江陵县| 绥化市| 佛坪县| 屏南县| 井陉县| 镇平县| 固始县| 会昌县| 苍溪县| 凉城县| 凌源市| 平果县| 安庆市| 万州区| 灵寿县| 曲阳县| 黄石市| 磐安县| 万年县| 会宁县| 黄梅县| 阳山县| 重庆市| 公主岭市| 高邮市| 亳州市| 紫云| 且末县| 曲松县| 宿松县| 青田县| 赞皇县| 景泰县| 绥阳县| 新竹市| 门源| 琼结县| 彝良县| 澳门| 黎平县|