• angular 指令@、=、&的用法和区别


    1.指令作用域中的@

    作用是把当前属性作为字符串传递。

    html:

    <div ng-controller="MyCtrl">
        <drink water="{{pureWater}}"></drink>
    </div>

    js:

    var myModule = angular.module("MyModule", []);
    myModule.controller('MyCtrl', ['$scope', function($scope){
          $scope.pureWater="纯净水";
    }]);
    myModule.directive("drink", function() {
          return {
             restrict:'AE',
            scope:{
                 water:'@'  /* link———— scope.water = attrs.water */
            },
             template:"<div>{{water}}</div>"
         }
    });

    result:

    这里:

    scope:{
           water:'@'
    }

    该表达式等价于:

    link:function(scope,element,attrs){
        scope.water=attrs.water;
    }

    具体含义就是在指令的scope上定义一个属性名:water,它的值就是前台界面中water属性的值,也就是"{{pureWater}}";

    同时{{pureWater}}的值我们从声明的控制器可以看出:

    $scope.pureWater="纯净水";

    2、指令作用域中的=

    作用是与父scope中的属性进行双向绑定
    <div ng-controller="MyCtrl">
    
        Ctrl:
        <input type="text" ng-model="pureWater">
    
        Directive:
        <drink water="pureWater"></drink>
    
    </div>                
    var myModule = angular.module("MyModule", []);
    myModule.controller('MyCtrl', ['$scope', function($scope){
        $scope.pureWater="纯净水";
    }])
    myModule.directive("drink", function() {
        return {
            restrict:'AE',
            scope:{
                water:'='
            },
            template:'<input type="text" ng-model="water"/>'
        }
    });

    这里=的手段类似,通过页面设置两个输入框,分别代表指令和控制器的作用域,在JS代码实现了双向绑定,做到了控制器与指令在各自作用域内能够影响对方,也就是双向通信,具体思路与@类似,不赘述,上图:

    3.指令作用域中的&

    主要作用是传递一个来自父scope的函数,稍后调用。

    <div ng-controller="MyCtrl">
        <greeting greet="sayHello(name)"></greeting>
        <greeting greet="sayHello(name)"></greeting>
        <greeting greet="sayHello(name)"></greeting>
    </div>
    var myModule = angular.module("MyModule", []);
    myModule.controller('MyCtrl', ['$scope', function($scope){
        $scope.sayHello=function(name){
            alert("Hello "+name);
        }
    }])
    myModule.directive("greeting", function() {
        return {
            restrict:'AE',
            scope:{
                greet:'&'
            },
            template:'<input type="text" ng-model="userName" /><br/>'+
             '<button class="btn btn-default" ng-click="greet({name:userName})">Greeting</button><br/>'
        }
    });

    从页面可以看出,这里定义了一个标签<greeting></greeting>,并在其中定义了属性名greet,与上面的@以及=不同的是,属性名后面是一个方法,所以,这里的&主要用于在Controller和directive之间传递函数,实现两者之间的函数通信,在JS中,将前台的greeting标签替换为template中的内容,一个输入框加上一个按钮,按钮上绑定了greet函数,与前台页面的greet相呼应,而前台的greet函数在控制器中有定义,所以指令中也是调用的控制器中的greet函数。执行结果如下:

    via: http://www.tuicool.com/articles/aAveEj

  • 相关阅读:
    安装CentOS7重启后提示License information
    使用VMware 安装Linux CentOS7
    VS 2015相当不错的功能:C#交互窗口
    未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包
    RabbitMQ service is already present
    RabbitMQ安装后不能运行 Error: unable to connect to node nodedown
    〖Demo〗-- 计算器
    〖Demo〗-- HAproxy配置文件操作
    〖Python〗-- 模块系列(二)
    〖Python〗-- 模块系列(一)
  • 原文地址:https://www.cnblogs.com/91allan/p/5427753.html
Copyright © 2020-2023  润新知