首页 > 其他分享 >angular指令和控制器交互

angular指令和控制器交互

时间:2022-11-01 14:24:07浏览次数:68  
标签:function 控制器 directive app showTopName myService scope 交互 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>

效果

 

标签:function,控制器,directive,app,showTopName,myService,scope,交互,angular
From: https://www.cnblogs.com/xiaohuasan/p/16847515.html

相关文章

  • shell免交互与交互
    一,HereDocument免交互1.概述使用I/O重定向的方式将命令列表提供给交互式程序或命令,如cat,read或ftp命令;是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来......
  • 探索使用 ViewContainerRef 的 Angular DOM 操控技术
    探索使用ViewContainerRef的AngularDOM操控技术​​https://indepth.dev/posts/1052/exploring-angular-dom-manipulation-techniques-using-viewcontainerref​​每当......
  • 实验6:开源控制器实践——RYU
    实验6:开源控制器实践——RYU一、实验目的能够独立部署RYU控制器;能够理解RYU控制器实现软件定义的集线器原理;能够理解RYU控制器实现软件定义的交换机原理。二、实验环......
  • fflush-交互式
    /* LinuxAPI:fflush function:实现交互式*/#include<stdlib.h>#include<stdio.h>#include<unistd.h>voidnemu(void);voidfun_sleep(constchar*c);int......
  • angular指令scope隔离数据
    111<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>AngularJS指令属性link</title><scriptsrc="https://cdn.bootcss.com/angular.js/1.7.0/angular.m......
  • angular 指令学习
    在指令中scope定义的值的用法:例如 scope:{   local:"@nameprop",   secondLocal:"@secondNameprop",   secondLocalTest:"@threeNameprop"  ......
  • Qt on Android 开发之 C++与Java 交互
    目录​​简述​​​​Qt引入Android模块​​​​Java示例​​​​Cpp与java交互​​简述我做了一个小例子,来实现了C++与Java之间的交互。该示例是以整形和字符型举例说明,......
  • DMA(三) - DMA控制器接口函数
    DMA控制器接口函数主要作用是配置DMA控制器并启动相应传输s3c2440中关于公共DMA控制器的函数提供有:s3c2410_dma_config()s3c2410_dma_ctrl()s3c2410_dma_enqueue()......
  • 关于JSON的前后交互
    文章目录​​1.首先前端要进行其中的值得替换可在javascript里面写​​​​2.使用ajax像后端传值使用url拼接的传值方式,不可以使用post的请求,会报错​​​​注意使用layui的......
  • 那些你不知道的炫酷导航交互效果
    基于上次发布的那些你不知道的炫酷按钮交互效果反馈比较好,后续将继续收集那些炫酷的交互效果,希望可以给你的项目添砖加瓦,更上一层楼。那些你不知道的炫酷交互效果系列:......