這次帶給大家angular的scopel指令使用詳解,使用angular的scopel指令注意事項有哪些,以下就是實戰案例,一起來看一下。
我們來建立一個自訂指令
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style> .primary{ background: red; } </style></head><body ng-app="myApp"> <div ng-controller="mainCtrl"> <my-btn></my-btn> </div> <script src="node_modules/angular/angular.min.js"></script> <script> var myApp = angular.module('myApp',[]); myApp.controller('mainCtrl',['$scope',function($scope){ $scope.myClass = 'primary'; }]); myApp.directive('myBtn',function(){ return { template:'<input type="button" value="按钮" class="{{myClass}}">' } }); </script></body></html>
#使用自訂指令像上面一樣的確不錯,但如果你想要對每個指令渲染出來的按鈕自訂化,好像不可以,例如下面我們創建一堆這個自訂指令,他們長得一模一樣:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style> .primary{ background: red; } </style></head><body ng-app="myApp"> <div ng-controller="mainCtrl"> <my-btn></my-btn> <my-btn></my-btn> <my-btn></my-btn> <my-btn></my-btn> </div> <script src="node_modules/angular/angular.min.js"></script> <script> var myApp = angular.module('myApp',[]); myApp.controller('mainCtrl',['$scope',function($scope){ $scope.myClass = 'primary'; }]); myApp.directive('myBtn',function(){ return { template:'<input type="button" value="按钮" class="{{myClass}}">' } }); </script></body></html>
一種想法是把這幾個自訂的指令按鈕放到不同的控制器裡面,然後控制器裡透過$scope上下文傳遞不同的值:
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>Document</title> <style> .primary{ background: red; } .success{ background: green; } .default{ background: gray; } </style></head><body ng-app="myApp"> <div ng-controller="aCtrl"> <my-btn></my-btn> </div> <div ng-controller="bCtrl"> <my-btn></my-btn> </div> <div ng-controller="cCtrl"> <my-btn></my-btn> </div> <script src="node_modules/angular/angular.min.js"></script> <script> var myApp = angular.module('myApp',[]); myApp.controller('aCtrl',['$scope',function($scope){ $scope.myClass = 'primary'; }]); myApp.controller('bCtrl',['$scope',function($scope){ $scope.myClass = 'success'; }]); myApp.controller('cCtrl',['$scope',function($scope){ $scope.myClass = 'default'; }]); myApp.directive('myBtn',function(){ return { template:'<input type="button" value="按钮" class="{{myClass}}">' } }); </script></body></html>
這樣寫太麻煩了,所以我們的angular為我們的自訂指令提供了一個配置項叫scope,所以,我們可以如下這樣寫:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style> .primary{ background: red; } .success{ background: green; } .default{ background: gray; } </style></head><body ng-app="myApp"> <div ng-controller="Controller"> <my-btn b="className1"></my-btn> <my-btn b="className2"></my-btn> <my-btn b="className3"></my-btn> </div> <script src="node_modules/angular/angular.min.js"></script> <script> var myApp = angular.module('myApp',[]); myApp .controller('Controller', ['$scope', function($scope) { $scope.className1 = 'primary'; $scope.className2 = 'success'; $scope.className3 = 'default'; }]) .directive('myBtn',function(){ return { scope:{ a:'=b' }, template:'<input type="button" value="按钮" class="{{a}}">' } }); </script></body></html>
要看懂上面的只要注意兩點:
這裡的獨立作用域裡面的a代表的是template裡面的模型a
#=b代表的是要angular去尋找視圖裡面的目前指令的屬性b
屬性b的值需要去外部作用域裡面去尋找
如果你想在指令作用域裡綁定的模型的名字和外部使用的時候的屬性名一樣,可以省寫成如下:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style> .primary{ background: red; } .success{ background: green; } .default{ background: gray; } </style></head><body ng-app="myApp"> <div ng-controller="Controller"> <my-btn a="className1"></my-btn> <my-btn a="className2"></my-btn> <my-btn a="className3"></my-btn> </div> <script src="node_modules/angular/angular.min.js"></script> <script> var myApp = angular.module('myApp',[]); myApp .controller('Controller', ['$scope', function($scope) { $scope.className1 = 'primary'; $scope.className2 = 'success'; $scope.className3 = 'default'; }]) .directive('myBtn',function(){ return { scope:{ a:'=' }, template:'<input type="button" value="按钮" class="{{a}}">' } }); </script></body></html>
當然,上面的=號是雙向資料綁定:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style> .primary{ background: red; } .success{ background: green; } .default{ background: gray; } </style></head><body ng-app="myApp"> <div ng-controller="Controller"> <my-btn a="abc"></my-btn> </div> <script src="node_modules/angular/angular.min.js"></script> <script> var myApp = angular.module('myApp',[]); myApp .controller('Controller', ['$scope', function($scope) { $scope.abc = '我是初始内容'; }]) .directive('myBtn',function(){ return { scope:{ a:'=' }, template:'<input type="text" ng-model="a"><span>{{a}}</span>' } }); </script></body></html>
如果只是想單向的資料通信,可以用@符號:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style> .primary{ background: red; } .success{ background: red; } .default{ background: red; } </style></head><body ng-app="myApp"> <div ng-controller="Controller"> <my-btn a="primary"></my-btn> </div> <script src="node_modules/angular/angular.min.js"></script> <script> var myApp = angular.module('myApp',[]); myApp .controller('Controller', ['$scope', function($scope) { $scope.mm = 'primary'; }]) .directive('myBtn',function(){ return { scope:{ a:'@' }, template:'<input type="button" value="按钮" class="{{a}}">' } }); </script></body></html>
如果想用ng-class,也是可以的:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style> .primary{ background: red; } .success{ background: red; } .default{ background: red; } </style></head><body ng-app="myApp"> <div ng-controller="Controller"> <my-btn a="primary"></my-btn> </div> <script src="node_modules/angular/angular.min.js"></script> <script> var myApp = angular.module('myApp',[]); myApp .controller('Controller', ['$scope', function($scope) { $scope.mm = true; }]) .directive('myBtn',function(){ return { scope:{ a:'@' }, template:'<input type="button" value="按钮" ng-class="{primary:a}">' } }); </script></body></html>
最後,還有一個scope可以設定是引用外部作用域的方法
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style> .primary{ background: red; } .success{ background: red; } .default{ background: red; } </style></head><body ng-app="myApp"> <div ng-controller="Controller"> <my-btn fn2="fn()"></my-btn> </div> <script src="node_modules/angular/angular.min.js"></script> <script> var myApp = angular.module('myApp',[]); myApp .controller('Controller', ['$scope', function($scope) { $scope.fn = function(){ alert(11); } }]) .directive('myBtn',function(){ return { scope:{ fn1:'&fn2' }, template:'<input type="button" value="按钮" ng-click="fn1()">' } }); </script></body></html>
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
以上是angular的scopel指令使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!