除了 AngularJS 内置的指令外,我们还可以创建自定义指令。
通过 .directive() 函数来添加自定义的指令。
调用自定义指令时,需要在HTMl 元素上添加自定义指令名。
自定义指令命名规则:使用驼峰命名法来命名,即除第一个单词外的首字母需大写。如: myDirective。
在html页面调用该指令时需要以 - 分割,如: my-directive。示例代码:
<body ng-app="myApp"> <my-directive></my-directive> <script> var app = angular.module("myApp", []); app.directive("myDirective", function() { return { template : "<h1>模板:可以写自己的html页面代码</h1>" }; }); </script> </body>
html页面调用自定义指令的四种方式
通过在自定义指令里添加 restrict 属性,根据设置不同的值来决定html页面的调用方式,如:
var app = angular.module("myApp", []); app.directive("myDirective", function() { return { restrict : "A",//只能通过属性调用 template : "<h1>自定义指令!</h1>" }; });
restrict值的不同,决定了调用方式的不同
属性值
调用方式
示例
A (Attribute首字母)
属性名
<div my-directive></div>
C (Class 首字母)
类名
<div></div>
E (Element 首字母)
元素名
<my-directive></my-directive>
M
注释
<!-- 指令: my-directive>
restrict 默认值为 EA, 即在html页面可通过元素名和属性名来调用自定义指令。
自定义指令属性详解
属性
值类型
说明
restrict
string
指令的调用方式,A、C、E、M
priority
number
指令执行的优先级
template
string
指令使用的模板,可将html页面代码写于此。只能与templateUrl二选其一
templateUrl
string
从指定的url地址加载模板。只能与template二选其一
replace
boolean
是否用模板替换当前元素。true : 将指令标签替换成temple中定义的内容,页面上不会再有<my-directive>标签;false :则append(追加)在当前元素上,即模板的内容包在<my-directive>标签内部。默认false。
transclude
boolean
是否将当前元素的内容转移到模板中
scope
boolean /object
指定指令的作用域。false(默认值): 使用父作用域作为自己的作用域(每个引用自定义指令的标签若其中一个标签改变某一变量值,则会影响其他标签的值 )。true: 新建一个作用域,该作用域继承父作用域(两个引用自定义指令的标签之间的变量互不影响)。JavaScript对象:与父作用域隔离,并指定可以从父作用域访问的变量
controller
function
定义与其他指令进行交互的接口函数
require
string
指定需要依赖的其他指令
link
function
以编程的方式操作DOM,包括添加监听器等
compile
function
编程的方式修改DOM模板的副本,可以返回链接函数
对表格里的知识进行延伸
1.templateUrl
如果template里拼写的html页面代码十分的多页复杂,拼字符串的话就太麻烦啦,这里我们就可以选择templateUrl。我们可以将要拼写的html页面代码独立到一个页面里,如template.html;然后再指定该html文件所在的路径即可,如templateUrl:”template.html”。用到该自定义指令时,会自动发一个http请求来获取template.html对应的模板内容。这样做的缺点是,多了一个http请求。别急,可以改进的:
angularjs规定了模板还可以用<Script>标签定义:
<script type="text/ng-template"> <div>自定义指令模板用Script标签定义的方式,须放在html页面ng-controller指令所在标签的内部</div> </script>
上面代码写在html页面的ng-controller指令所在标签的里面,这样就不用再去请求它了。示例: