天天看点

angular directive详解之scope如果不写scope,默认与controller共享scopescope:{},即最简单的隔离,contoller和directive使用完全不同的scope,互不影响.=示例@示例&示例:

scope是控制directive中的变量与引用directive的controller之间的关系的重要属性。其有四种修饰符

  • =表示共享某个变量 Two-way model binding
  • &表示共享某个方法(回调) Callback method binding
  • @表示传递某个值 Attribute string binding

如果不写scope,默认与controller共享scope

例:

<!DOCTYPE html>
<html ng-app="app">

<head>
  <title></title>
  <script src="//cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
</head>

<body>
  <div ng-controller="ctrl1">
    <div>contoler数据:{{myData}}</div>
    <div my-directive>
    </div>
  </div>
  <script>
  var app = angular.module('app', []);
  app.directive('myDirective', [function() {
    return {
      replace: true,
      template: '<div>directive数据:{{myData}}<button ng-click="change()">改变</button></div>',
      link: function(scope) {

      }
    }
  }])
  app.controller('ctrl1', ['$scope', function($scope) {
    $scope.myData = 'controller data';
    $scope.change = function(){
      $scope.myData = 'ha ha ha';
    }
  }])
  </script>
</body>

</html>
           

点击改变按钮时,contorller和diretive中的myData都变成了ha ha ha。共享scope时(即不隔离),diretive可以完全使用,覆盖controller的变量和方法,反之也一样。当然这样在实际项目中会造成灾难性的影响,官方也不建议这样做。英文原文是: This is clearly not a great solution.

scope:{},即最简单的隔离,contoller和directive使用完全不同的scope,互不影响.

<!DOCTYPE html>
<html ng-app="app">

<head>
  <title></title>
  <script src="//cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
</head>

<body>
  <div ng-controller="ctrl1">
    <div>contoler数据:{{myData}}</div>
    <div my-directive>
    </div>
  </div>
  <script>
  var app = angular.module('app', []);
  app.directive('myDirective', [function() {
    return {
      replace: true,
      template: '<div>directive数据:{{myData}}<button ng-click="change()">改变</button></div>',
      scope:{},
      link: function(scope) {
        scope.myData = 'directive data';
      }
    }
  }])
  app.controller('ctrl1', ['$scope', function($scope) {
    $scope.myData = 'controller data';
    $scope.change = function(){
      $scope.myData = 'ha ha ha';
    }
  }])
  </script>
</body>

</html>
           

controller中的myData和directive中的myData不同,点击改变按钮也没用。

=示例

<!DOCTYPE html>
<html ng-app="app">

<head>
  <title></title>
  <script src="//cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
</head>

<body>
  <div ng-controller="ctrl1">
    <div>contoler数据:{{myData}}</div>
    <div my-directive my-data-a = 'myData'>
    </div>
  </div>
  <script>
  var app = angular.module('app', []);
  app.directive('myDirective', [function() {
    return {
      replace: true,
      template: '<div>directive数据:{{myData}}<button ng-click="change()">改变</button></div>',
      scope:{
        // myData: '=',如果名称相同可省略
        myData: '=myDataA'
      },
      link: function(scope) {
        scope.change=function(){
          scope.myData = 'ha ha ha';
        }
      }
    }
  }])
  app.controller('ctrl1', ['$scope', function($scope) {
    $scope.myData = 'controller data';
  }])
  </script>
</body>

</html>
           

点击改变按钮,controller和directive的myData都变成了ha ha ha;

@示例

<!DOCTYPE html>
<html ng-app="app">

<head>
  <title></title>
  <script src="//cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
</head>

<body>
  <div ng-controller="ctrl1">
    <div>contoler数据:{{myData}}</div>
    <div my-directive my-data-a = 'ba ba ba'>
    </div>
  </div>
  <script>
  var app = angular.module('app', []);
  app.directive('myDirective', [function() {
    return {
      replace: true,
      template: '<div>directive数据:{{myData}}<button ng-click="change()">改变</button></div>',
      scope:{
        // myData: '=',如果名称相同可省略
        myData: '@myDataA'
      },
      link: function(scope) {
        scope.change=function(){
          scope.myData = 'ha ha ha';
        }
      }
    }
  }])
  app.controller('ctrl1', ['$scope', function($scope) {
    $scope.myData = 'controller data';
  }])
  </script>
</body>

</html>
           

此例中,directive的myData值为ba ba ba。点击改变按钮,directive的myData为ha ha ha,controller的myData不受影响。

&示例:

<!DOCTYPE html>
<html ng-app="app">

<head>
  <title></title>
  <script src="//cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
</head>

<body>
  <div ng-controller="ctrl1">
    <div>contoler数据:{{myData}}</div>
    <div my-directive on-change="change(value)">
    </div>
  </div>
  <script>
  var app = angular.module('app', []);
  app.directive('myDirective', [function() {
    return {
      replace: true,
      template: '<div>directive数据:{{myData}}<button ng-click="change()">改变</button></div>',
      scope:{
        // myData: '=',如果名称相同可省略
        // myData: '@myDataA'
        onChange: '&onChange'
      },
      link: function(scope) {
        scope.myData = 'directive data';
        scope.change = function(){
          scope.onChange({
            value: 'ha ha ha'
          });
        }
      }
    }
  }])
  app.controller('ctrl1', ['$scope', function($scope) {
    $scope.myData = 'controller data';
    $scope.change = function(value){
      $scope.myData = value;
    }
  }])
  </script>
</body>

</html>
           

点击改变按钮,controller的myData变成ha ha ha。directive的myData不受影响。 注意directive中调用共享的方法的时候,传值是一个object, key为参数名.