Angular中的模板

Angular自身提供了一套完整的模板系统,配合$scope对象和数据双向绑定机制,将页面纯静态元素经过行为、属性的添加和格式的转换,最终变成在浏览器中显示的动态页。

在模板系统中,可包含Angular的指令、数据绑定、表单控件和过滤器,同时,在处理复杂程序时,可以构建多个模板页面作用于视图层。在主页中,再通过包含(include)的方式加载这些零散的模板页。这样做的好处在于,一次定义可多处调用,增加代码的重复使用,减少维护成本。

1. 构建模板内容

 ① 直接在页面中添加元素和Angular指令,依赖控制器中构建的属性和方式绑定模板中的元素内容和事件,实现应用需求。
 ② 通过"type"类型为"text/ng-template"的<script>元素来构建一个用于绑定数据的模板,在模板内部添加数据绑定和元素的事件。
 ③ 通过添加元素的"src"属性,导入一个外部文件作为绑定数据的模板,在导入数据模板时,除添加"src"属性外,还需要使用"ng-include"指令。

例1:首先通过<script>元素构建了一个显示两项数据信息的模板;然后,在新增的一个<div>元素中将模板的内容导入到元素中。

<script type="text/ng-template" id="tplbase">
    姓名:{{name}},<br>
    邮箱:{{email}}
</script>
<div ng-include src="'tplbase'" ng-controller="fn"></div>
<script src="js/angular.min.js"></script>
<script>
    var mod = angular.module('aa',[]);
    mod.controller('fn',['$scope', function ($scope) {
        $scope.name="zyt";
        $scope.email="zouyitingRae@163.com"
    }])
//    先添加一个"type"类型为"text/ng-template"的<script>元素,并在该元素中通过双花括号的方式绑定控制器中需要显示的两项数据。
//    由于该元素定义的是Angular类型的模板,因此,它可以直接使用Angular中的表达式进行数据绑定,除此之外,还可以在模板中绑定元素的各类事件

//    在完成模板内容构建之后,新添加一个<div>元素,用来导入模板内容。在导入时,首先添加"ng-include"指令,声明该元素的内容来源于其他模板;
//    然后再添加"src"属性,指定对应模块的名称,即ID号或模板文件名称。需要注意的是:"src"属性值是一个表达式,它可以是$scope中的属性名,
//    也可以是普通字符串。如果是后者,必须添加引号
</script>

2. 使用指令复制元素

在构建模板内容的过程中,有时需要反复将不同的数据加载到一个元素中,例如,通过< li>元素绑定一个数组的各成员。此时,可以使用"ng-repeat"指令,它的功能时根据绑定数组成员的数量,复制页面中被绑定的< li>元素,并在复制过程中添加元素相应的属性和方法,通过这种方式,实现数组数据与元素绑定的过程。
在使用"ng-repeat"指令复制元素的过程中,还提供了几个非常实用的专有变量,可以通过这些变量来处理显示数据时的各种状态。这些变量的功能分别如下:

  --$first,该变量表示记录是否是首条,如果是则返回true,否则返回false.
  --$last,该变量表示记录是否是尾条,如果是则返回true,否则返回false.
  --$middle,该变量表示记录是否是中间条,如果是则返回true,否则返回false.
  --$last,该变量表示记录的索引值,其对应的值从0开始.

例2:在页面中,通过< li>元素显示一个数组中的全部成员数据,并且在显示数据时列出当条数据是否是“首条”和“尾条”记录的状态信息。

   <style>
        body{font-size: 12px;}
        ul{list-style: none;width: 400px;margin: 0;padding: 0;}
        li{float: left;padding: 5px 0;}
        span{width: 50px;float: left; padding: 0 10px;}
    </style>
<div ng-controller="fn">
    <ul>
        <li>
            <span>序号</span>
            <span>姓名</span>
            <span>性别</span>
            <span>是否首条</span>
            <span>是否尾条</span>
        </li>
        <li ng-repeat="stu in data">
            <span>{{$index+1}}</span>
            <span>{{stu.name}}</span>
            <span>{{stu.sex}}</span>
            <span>{{$first?'是':'否'}}</span>
            <span>{{$last?'是':'否'}}</span>
        </li>
    </ul>
</div>
<script src="js/angular.min.js"></script>
<script>
    var mod = angular.module('aa',[]);
    mod.controller('fn',['$scope', function ($scope) {
        $scope.data=[
            {name:'赵四',sex:'女'},
            {name:'张三',sex:'男'},
            {name:'王二',sex:'男'},
        ]
    }]);
</script>

3. 添加元素样式

① 直接绑定值为CSS类别名称的$scope对象属性
    例:$scope.red="red";
       <div class="{{red}}"></div>   ===   <div ng-class="{{red}}"

② 以字符串数组方式选择性添加CSS类别名称
    例:$scope.blnfocus=true;
       <div ng-class="{true:'red',false:'blue'}[blnfocus]"></div>
       <div>的CSS样式取决与"blnfocus"属性值,当该值为true时,添加“red”样式名,当该值为false时,添加“blue”样式名。这种方式只能在两种样式中选择一种,并且{}和[]顺序不可颠倒。在{}中设置可选择的两种样式名称,在[]中设置控制样式的的属性名。

③ 通过定义key/value对象的方式来添加多个CSS类别名称
    例:$scope.a=false;
        $scope.b=true;
        <div ng-class="{'red':a,'blue':b}"></div>

此外,在Angular中,还有另外两个用于添加样式的页面指令,分别为"ng-class-odd"和"ng-class-even"专用于以列表方式显示数据,对应奇数行和偶数行的样式。

例3:在例2的基础上,在样式方面增加三个功能,首先,将第一个< li>元素中显示的字体加粗;其次,添加"ng-class-odd"和"ng-class-even"两个指令,实现列表的隔行变色功能;最后,当单击某行< li>的元素时,显示相应的背景色。

<style>
        body{font-size: 12px;}
        ul{list-style: none;width: 408px;margin: 0;padding: 0;}
        li{float: left;padding: 5px 0;}
        ul .odd{color: #0026ff;}
        ul .even{color: #f00;}
        ul .focus{color: #ccc;}
        ul .bold{font-weight: bold;}
        span{width: 52px;float: left; padding: 0 10px;}
</style>

<div ng-controller="fn">
    <ul>
        <li ng-class="{{bold}}">
            <span>序号</span>
            <span>姓名</span>
            <span>是否首条</span>
            <span>是否尾条</span>
        </li>
        <li ng-class-odd="'odd'" ng-class-even="'even'" ng-repeat="stu in data" ng-click="li_click($index)" ng-class="{focus:$index==focus}">
            <span>{{$index+1}}</span>
            <span>{{stu.name}}</span>
            <span>{{stu.sex}}</span>
            <span>{{$first?'是':'否'}}</span>
            <span>{{$last?'是':'否'}}</span>
        </li>
    </ul>
</div>
<script src="js/angular.min.js"></script>
<script>
    var mod = angular.module('aa',[]);
    mod.controller('fn',['$scope', function ($scope) {
        $scope.bold='bold';
        $scope.li_click= function (i) {
            $scope.focus=i;
        }
        $scope.data=[
            {name:赵四',sex:'女'},
            {name:'张三',sex:'男'},
            {name:'王二',sex:'男'},
        ]
    }]);
</script>

4.控制元素的显示与隐藏状态

在Angular中,可以通过“ng-show”“ng-hide”“ng-switch”指令来控制元素的隐藏与显示的状态。前两个指令直接控制元素的显示与隐藏状态。当“ng-show”值为true或“ng-hide”值为false时,元素显示,反之,元素隐藏。
后一个“ng-switch”指令的功能是显示匹配成功的元素,该指令需要结合"ng-switch-when"和"ng-switch-default"指令使用。在"ng-switch"指令中,当指定的“on”值与某个或多个添加"ng-switch-when"指令的元素匹配时,这些元素显示,其他未匹配的元素则隐藏。如果没有找到与“on”值相匹配的元素时,则显示添加了"ng-switch-default"指令的元素。
例4:

<div ng-controller="fn">
    <div ng-show={{isShow}}>zyt</div>
    <div ng-hide={{isHide}}>zouyitingrae@163.com</div>
    <ul ng-switch on={{switch}}>
        <li ng-switch-when="1">zyt</li>
        <li ng-switch-when="2">zouyitingrae@163.com</li>
        <li ng-switch-default>更多...</li>
    </ul>
</div>
<script src="js/angular.min.js"></script>
<script>
    var mod = angular.module('aa',[]);
    mod.controller('fn',['$scope', function ($scope) {
        $scope.isShow = true;
        $scope.isHide = false;
        $scope.switch = 3;
    }]);
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容