• 制作一个自定义的Directive
    • 代码分析
      • template
        • 用替换而不是插入的方式应用Directive
      • restrict

    制作一个自定义的Directive

    下面我们将制作我们的第一个自定义Directive。让我们对app.jsindex.html进行一些修改:

    1. //app.js
    2. var App = angular.module("App", []);
    3. App.directive("people", function(){
    4. return {
    5. restrict: "E",
    6. template : "<p>姓名:{{data.name}}</p><p>性别:{{data.sex}}</p>"
    7. }
    8. });
    9. App.controller("FirstCtrl", function ($scope) {
    10. $scope.data = {
    11. name: "Harry",
    12. sex : "男"
    13. };
    14. });
    1. <!DOCTYPE html>
    2. <html lang="zh" ng-app="App">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>{{"学习AngularJS 1.x"}}</title>
    6. <link type="text/css" rel="stylesheet" href="css/style.css">
    7. </head>
    8. <body>
    9. <div ng-controller="FirstCtrl">
    10. <!-- 注意这里只加入了一个people的标签 -->
    11. <people></people>
    12. </div>
    13. <script type="text/javascript" src="components/angular/angular.js"></script>
    14. <script type="text/javascript" src="js/app.js"></script>
    15. </body>
    16. </html>

    运行结果:

    图5-1 Directive运行效果

    代码分析

    以下这段代码用于声明一个Directive:

    1. App.directive("people", function(){
    2. return {
    3. restrict : "E",
    4. template : "<p>姓名:{{data.name}}</p><p>性别:{{data.sex}}</p>"
    5. }
    6. });

    我们将这段代码分拆开逐步讲解:

    首先,声明一个Directive的基本结构如下,我们调用了directive()函数来告诉AngularJS加入一个新的Directive:

    1. App.directive();

    调用这个函数,我们需要传入2个参数,第一个参数是Directive的命名(这里是people),第二个参数是这个Directive的功能。

    1. App.directive("people", function(){});

    在实例中,我们直接在第二个参数的函数中返回了一个对象:

    1. return {
    2. restrict: "E",
    3. template : "<p>姓名:{{data.name}}</p><p>性别:{{data.sex}}</p>"
    4. }

    这个对象中有两个元素,restricttemplate

    template

    template相对比较容易理解,在运行网页时,HTML对应的标签,将被替换成对应的内容。我们这里看看替换后实际的HTML代码如何:

    图5-2 Directive生效后的html代码

    可以看到,AngularJS在<people></people>中间加入了template中的内容。

    用替换而不是插入的方式应用Directive

    如果在配置Directive时,加入replace : true(与restricttemplate同级别),则可以让AngularJS用替换的模式应用Directive。

    1. App.directive("people", function(){
    2. return {
    3. restrict : "E",
    4. replace : true,
    5. template : "<p>姓名:{{data.name}}</p><p>性别:{{data.sex}}</p>"
    6. }
    7. });

    具体的效果,是会去除掉<people> </people>这对标签。

    restrict

    restrict是告诉AngularJS,这个Directive应该如何使用。

    下面这个表格,总结了restrict可能有的值,具体的每种应用方案,我们将在下一节详解。

    对应类型 使用方法
    E element <people> </people>
    A attribute <div people> </div>
    C class <div class="people"> </div>
    EAC - 以上三种都可使用

    如果在restrict中设定了使用方法,而在HTML代码中却未按照对应的方法使用,那么代码将不会生效!