2.指令

1.内置指令

什么是指令?

HTML在构建应用(App)时存在诸多不足之处,AngularJS通过扩展一系列的HTML属性或标签来弥补这些缺陷,所谓指令就是AngularJS自定义的HTML属性或标签,这些指令都是以ng-做为前缀的,例如ng-app、ng-controller、ng-repeat等。

内置指令

ng-app 指定应用根元素,至少有一个元    素指定了此属性。
ng-controller 指定控制器
ng-show控制元素是否显示,true显示、    false不显示
ng-hide控制元素是否隐藏,true隐藏、    false不隐藏
ng-if控制元素是否“存在”,true存在、    false不存在
ng-src增强图片路径
ng-href增强地址
ng-class控制类名
ng-include引入模板
ng-disabled表单禁用
ng-readonly表单只读
ng-checked单/复选框表单选中
ng-selected下拉框表单选中
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src=angular.js></script>
    <script>

        /*1.创建模板*/
        var app = angular.module('app',[]);

        /*2.创建控制器 */
        app.controller('zmController',['$scope',function($scope){
            $scope.name1='我是p标签1'
            $scope.name2='我是p标签2'
        }])
    </script>
</head>
<!--3.绑定模板 -->
<!--4.绑定控制器-->
<body ng-app="app" ng-controller='zmController'>

<!--本质上就是css样式中的display-->
<!--还是存在的只是隐藏了-->

<p ng-show = "true">{{name1}}</p>
<p ng-hide = "false">{{name2}}</p>

<!--控制该标签是否存在-->
<!--不存在了-->
<p ng-if='false'>{{name2}}</p><!--出现以后我下次再也不想要他了 考虑到性能问题 比如广告 蒙版 -->
</body>
</html>

2.事件处理

使用方法为:ng-事件名称 = “事件响应方法名称( 参数)"
    参数可以自己指定, 
    也可以传入事件对象$event
    使用$scope来去实现事件定义的方法
       $scope.事件名称 = function(参数){

        }
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .red{
            color: red;
        }
        .fz50{
            font-size: 50px;
        }
    </style>
    <script src = "angular.js"></script>
    <script>

        /*1.创建模板*/

        var app = angular.module('app',[]);

        /*2.创建控制器*/
        app.controller('zmController',["$scope",function($scope){
            /*1*/
            $scope.name1 = "我是p标签1";
            $scope.name2 = "我是P标签2";

            /*2*/
            $scope.url="002.jpg"

            /*4.*/
            $scope.isClass=false;

            /*5.*/
            //在模型当中实现事件方法
            $scope.change1=function(){
                $scope.isClass=true;
            };
            $scope.change2=function(){
                $scope.isClass=false;
            }
            
            
            
            $scope.sty={
                'font-size':'100px'
            }
        }]);

        /*3.绑定模板*/
        /*4.绑定控制器*/

    </script>
</head>
<body ng-app='app' ng-controller="zmController">
<!--1-->
<!--本质上就是css样式中的display-->
<!--还是存在的只是隐藏了-->
<p ng-show = "true">{{name1}}</p>
<p ng-hide = "false">{{name2}}</p>

<!--控制该标签是否存在-->
<!--不存在了-->
<p ng-if='false'>{{name2}}</p>

<!--2.-->
<!--![](002.jpg)--><!--实用原生的src链接一个图片-->
<!--![]({{url}})--><!--也显示但是会报错 script在下面的时候 页面从上往下执行走到src找地址 找url没有url地址 第一次找地址没有找到 找不到{{url}} 会报错 404 -->
![]({{url}})<!--原生的HTML认不得ng-src 所以就不发请求就不会有错误 走到下面加载angular的时候再去加载

Angular 机制:
把所有DOM元素渲染完成之后,再去回头解析属于angular的东西


-->
<!--3-->
<!--
ng-class="{key:value}" 可以写多个
value是bool类型
-->
<p ng-class='{red:true,fz50:true}'>我是p标签</p>
<!--4-->
<p ng-class='{red:isClass,fz50:isClass}'>我是p标签</p>

<!--5-->
<!--事件处理
    1.定义事件
    2.在模型当中实现事件方法
-->
<button ng-click='change1()'>添加类</button>
<button ng-click='change2()'>移除类</button>
</body>
</html>

ng-include

在html当中是没有办法直接引入其它文件。
浏览器不允许html对文件进行操作。
原因:出于安全考虑。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="angular.js"></script>
    <script>
        /*1.创建模板*/
        var app = angular.module('app',[]);
        /*2.创建控制器*/
        app.controller('zmController',["$scope",function($scope){


        }])
        /*3.绑定模板*//**/
        /*4.绑定控制器*/


    </script>
</head>
<body ng-app="app">
<!--
  原理:
  其实就是发送一个ajax请求
  把请求的结果,插入到dom当中
-->

<div ng-include="'header.html'"></div>
<div>主题</div>
<div ng-include="'footer.html'"></div>

</body>
</html>

ng-switch
用于数据筛选

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<script src=angular.js></script>
<script>
    /*1.创建模块*/
    var app = angular.module('app',[]);
    /*2.创建控制器*/
    app.controller("zmController",["$scope",function($scope){

        $scope.course = ['html','js' ,'css']

    }])

    /*3.绑定模板*/
    /*4.绑定控制器*/



</script>
<body ng-app='app' ng-controller='zmController'>
<ul>
    <li ng-repeat="value in course" ng-switch='value'>{{value}}
        <!--满足条件的展示出来 不满足的隐藏-->
    <p ng-switch-when='css'>{{value}}</p>
    </li>
</ul>
</body>
</html>

3.自定义指令

AngularJS允许根据实际的业务需要自定义指令.通过angular全局对象下的directive方法实现

自己给原生的html标签添加一些新属性,属性的名称自己决定
添加属性之后,要做什么功能,自己去决定

image.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body ng-app='app'    ng-controller="zmController">

<p>{{name}}</p>
<!--自定义指令-->
<zm></zm>
<p zm></p>

<script src=angular.js></script>
<script>
    /*1.创建模板*/
    varapp=angular.module('app',[])   ;
    /*2.创建控制器*/
    app.controller("zmControlle",["$scope",function($scope){
$scope.name="zm"
    }])
    /*3.绑定模板*/
    /*4.绑定控制器*/
    
 <!--自定义指令-->

    app.directive("zm", function()     {
        /*返回一个对象*/
        return{
            /*
             E:以元素形式出现
             A:以属性形式出现
             C:以类的形式出现
             * */
            restrict:'EA',
            template:"<div><1>我是一   个指令模板<p>我是标签<    /p></h1>   <p>1111</p></div>,// //指令模板必须得要有一个根元素包裹起来。
            replace:false //是否替换原标签
        }

    });
</script>
</body>
</html>
  

自定义指令

第一个参数 指令名称

第二个参数 回调函数

E:以元素形式出现
A:以属性形式出现
C:以类的形式出现
image.png

templateUrl:"./template.html"//可以传路径

image.png

transclude:true //是否保留标签当中的内容

是否替换原有标签一定要是false,否则不出现任何东西

image.png
image.png
image.png
image.png

指令的作用域

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body ng-app='app' ng-controller="zmController">
<!--<zmDir></zmDir>   结果出不来-->
<zm-dir></zm-dir><!--我是p-->
<p zm-dir></p><!--我是p-->
<!--1.在使用指令时,一定要注意大小写,

如果定义指令名称为大写,在使用时转成"-"-->
</body>
<script src=angular.js></script>
<script>
    /*1.创建模板*/
    var app=angular.module('app',[]);
    /*2.创建控制器*/
    app.controller("zmController",["$scope",function($scope){
    }])
    /*3.绑定模板*/
    /*4.绑定控制器*/

    app.directive("zmDir", function () {
        /*返回一个对象*/
        return{
            restrict:'EA',
            template:"<p>我是p</p>",
            replace:false,//是否替换原有标签
            transclude:true//是否保留标签当中的内容
        }

    });
</script>

</html>

这个效果是当我在输入框中输入内容时,底下的p标签里的内容就是什么

input里有什么

p就有什么

image.png
image.png
image.png

p里有什么

input里就有什么

/默认情况下, 指令使用的模型是与它所在控制器使用的是同一个/

image.png

controller:function ($scope) {//自定义的指令,可以有自己的作用域。有自己的模型

image.png

4.控制器作用域

1.每个属性所在的控制器都有对应的值的情况就是一一对应

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body ng-app="app" >
<div ng-controller='parentController'>
    <p>{{name}}</p>

    <div ng-controller='zmController'>
        <p>{{name}}</p>
    </div>
    
    <div ng-controller='zmController1'>
        <p>{{name}}</p>
    </div>
</div>
</body>

<script src="angular.js"></script>
<script>
    /*1.创建模块*/
    var app = angular.module('app',[]);
    /*2.创建控制器*/

    app.controller('parentController',['$scope',function ($scope) {
        $scope.name="parent"
    }]);

    app.controller('zmController',['$scope',function ($scope) {
     $scope.name="zm"
    }]);

    app.controller('zmController1',['$scope',function ($scope) {
        $scope.name="zm1"
    }]);
    /*3.绑定模块 ng-app="app"*/
    /*4.绑定控制器 */
</script>

</html>
image.png

2.找属性时,如果自己所在的控制器,没有该属性,就会去它对应的父级

image.png
image.png
image.png

3.如果父级也没有该属性,那就找不到值.
父级作用域不能访问子集的属性.找不到,所以不显示

image.png

找不到,所以不显示

image.png

4.根作用域:全局作用域
$rootScope.name=zm;
ng-init:初始化全局作用域

image.png
image.png

当父级属性为空时找到body中的初始化值使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容