angular指令和控制器交互

使用情况看代码里面注释说明

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>AngularJs指令属性transclude</title>
    <script src="https://cdn.bootcss.com/angular.js/1.7.0/angular.min.js"></script>

</head>

<body ng-app='app'>
    <div ng-controller="mydemo">
        <input type="text" value="" ng-model="user.name"/>
        {{sonData}}
        <br>
        {{showTopName}}
        <hr>
        <div> <textarea cols="30" rows="4" ng-model="text"></textarea></div>
        <hr>
        <my-directive ng-transclude>
          9999 {{showTopName}}9999 showTopName之所以可以在这里显示,因为指令没有设置scope,所有数据共享
        </my-directive>
        <hr>
        <div my-directive>
            hello这是没有设置ng-transclude所以不展示出来
        </div>
   
        <select-data on-to-parent="acceptClick()" my-user="user" to-parent="sonData" show-top-name="showTopName" ></select-data>
        <hr>
        <!-- <select-data ></select-data> -->
    </div>
</body>
<script type="text/javascript">
    var app = angular.module('app', []);
    app.directive("myDirective",myDirective);
    function myDirective(){
        var directive={
            restrict:"AE",
            template:"<div><h3>这是测试数据</h3></div>",
            replace:true,
            transclude:'element' //设置这个值,然后在指令上设置ng-transclude 就可以把指令中的内容展示,替换原来template的数据
        };
        return directive;
    };
    app.directive("selectData",selectData);
    function selectData(myService){ //传一个服务进去
        var directive={
            restrict:"AE",
            template:" Say:{{user.name}} <div ng-click='newSonClick(88888)' >我来点击</div><div> to----【{{ newShowTopName}}】--->自己的数据{{newData}}---【】</div><div>指令:{{sonData}}</div> <input type='text' value='' ng-model='user.name'/>",
           // template:'<div>点击我,有惊喜哦</div>',
            scope:{
                user: "=myUser",
                sonData:'=toParent',//son+xx表示在内部使用,toParent 表示对外且是属性 
                mySelf:"=" , 
                sonClick: '&onToParent',//son+xxx表示在指令内部使用 onToParent 表示对外且是属性
                showTopName:'='
             
            },
            controller:function($scope){ //必须使用$符号
                $scope.newData="bigHello";
               
            },
          //  replace:true,
            // controller:function(scope){
            //     scope.newData="bigHello";
            // },
            link:function(scope,el, attr){
                //scope.sonData="我是son指令数据";
                scope.newSonClick=function(toData){
                   // console.log(myService,"myService")
                   myService.setServiceName(toData); //服务接收传参数
                   scope.sonClick();
                   //scope.mySelf="myself10000";
                }
                // el.on("click",function(){   // 只有设置 scope:true才有效果,其他形式没有效果,会报topClick没有定义错误
                //     scope.topClick();
                // })
                scope.newShowTopName=scope.showTopName; //指令接受的值必须通过定义来,或者通过服务获取得到,否则无效,甚至报错
            }
        }
        return directive;
    };
    //创建服务
    app.service("myService",myService);
      function myService(){
         var serviceName;
          this.setServiceName=function(newName){ //赋值
             serviceName=newName;
          }
          this.getServiceName=function(){ //取值
            return serviceName;
         }
         console.log(serviceName,"aaaa");
        
        
       };
    app.controller("mydemo", ["$scope","myService",function ($scope,myService) {
        $scope.parentName="父层数据";//定义值

        $scope.showTopName="父级数据";
        $scope.acceptClick=function(){
            //console.log(myService.getServiceName(),"接收");
             $scope.showTopName=myService.getServiceName(); //父级接收服务传来的参数
        }
        $scope.sonData="我来自父级";
        //父级方法
        $scope.topClick=function(){
            alert("我是父级方法")
        }
        $scope.user = {
            name: 'hello',
            id: 1
        };
    }])
</script>

</html>

 

 父控制器的内容可以在自己控制范围内使用,包括子控制器

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>AngularJs指令属性transclude</title>
    <script src="https://cdn.bootcss.com/angular.js/1.7.0/angular.min.js"></script>

</head>

<body ng-app='app'>
    <div ng-controller="mydemo">
        <input type="text" value="" ng-model="user.name"/>
        {{sonData}}
        <br>
        {{showTopName}}
        <hr>
        <div> <textarea cols="30" rows="4" ng-model="text"></textarea></div>
        <hr>
        <my-directive ng-transclude>
          9999 {{showTopName}}9999 showTopName之所以可以在这里显示,因为没有设置scope,所有数据共享
        </my-directive>
        <hr>
        <div my-directive>
            hello这是没有设置ng-transclude所以不展示出来
        </div>
   
        <select-data  my-user="user"></select-data>
        <hr>
        【{{childTest}}】
        <!-- <select-data ></select-data> -->
        <div ng-controller="myChild">
            {{childTest}}
            <hr>
            {{showTopName}}
        </div>
    </div>
</body>
<script type="text/javascript">
    var app = angular.module('app', []);
    app.directive("myDirective",myDirective);
    function myDirective(){
        var directive={
            restrict:"AE",
            template:"<div><h3>这是测试数据</h3></div>",
            replace:true,
            transclude:'element' //设置这个值,然后在指令上设置ng-transclude 就可以把指令中的内容展示,替换原来template的数据
        };
        return directive;
    };
    app.directive("selectData",selectData);
    function selectData(myService){ //传一个服务进去
        var directive={
            restrict:"AE",
            template:" Say:{{user.name}} <div >我来点击</div><div> to------->自己的数据</div><div>指令:</div> <input type='text' value='' ng-model='user.name'/>",
           // template:'<div>点击我,有惊喜哦</div>',
            scope:{
                user: "=myUser"
             
            },
          
          //  replace:true,
            link:function(scope,el, attr){
                //scope.sonData="我是son指令数据";
                scope.newSonClick=function(toData){
                   // console.log(myService,"myService")
                   myService.setServiceName(toData); //服务接收传参数
                   scope.sonClick();
                   
                }
                // el.on("click",function(){   // 只有设置 scope:true才有效果,其他形式没有效果,会报topClick没有定义错误
                //     scope.topClick();
                // })
            }
        }
        return directive;
    };
    //创建服务
    app.service("myService",myService);
      function myService(){
         var serviceName;
          this.setServiceName=function(newName){ //赋值
             serviceName=newName;
          }
          this.getServiceName=function(){ //取值
            return serviceName;
         }
         console.log(serviceName,"aaaa");
        
        
       };
    app.controller("mydemo", ["$scope","myService",function ($scope,myService) {
        $scope.parentName="父层数据";//定义值

        $scope.showTopName="父级数据";
        $scope.acceptClick=function(){
            //console.log(myService.getServiceName(),"接收");
             $scope.showTopName=myService.getServiceName(); //父级接收服务传来的参数
        }
        $scope.sonData="我来自父级";
        //父级方法
        $scope.topClick=function(){
            alert("我是父级方法")
        }
        $scope.user = {
            name: 'hello',
            id: 1
        };
    }])
    app.controller("myChild",function($scope){
        $scope.childTest="我是子控制器";
    });
</script>

</html>

效果

 参考:https://blog.csdn.net/qq_29287973/article/details/74076552

posted @ 2022-11-01 14:14  剧里局外  阅读(14)  评论(0编辑  收藏  举报