angularjs指令

1.指令属性列表
.directive('directivename', function(){ return { restrict: String, replace: Boolean, transclude: Boolean, template: String or Template Func, templateUrl: String, priority: Number, terminal: Boolean, scope: Boolean or Obj, controller: String or Func, controllerAs: String, link: Func, compile: Func } })


2.属性使用

  • restrict
    取值:ACEM。A(属性,默认值),E(元素),C(类名),M(注释)
  • replace
    取值:true、false。true(指令所在标签被替换),false(不替换,默认值)
  • transclude
    取值:true、false。true(保留指令标签内部内容,ng-transclude存储原来内容),false(清空内部内容)
  • template
    取值:string、Func。string(字符串拼接内容),func(方法retrun模版内容)
  • templateUrl
    取值:string。外部模版地址
  • priority、terminal
    多个指令在同一元素内并且同时显示时会报错,所以它们组合使用。
    priority(默认都相同,为0)根据数值从大到小排序优先级;
    terminal(默认为false)为true时不显示比所在指令优先级低的指令
    举个栗子
    HTML
    base.html
    <div parent> ng-controller. <child1 child2></child1> </div>
    templateUrl1.html
    <h1>HELLO</h1>
    script
    angular.module('myApp', [])
    .directive('parent', function() {
    return {
    replace: true,
    transclude: true,
    template: '<div>Hello directive.
    <span ng-transclude></span></div>'
    }
    })
    .directive('child1', function() {
    return {
    restrict: 'E', // 小写还不行
    replace: false, // false可以不设置
    templateUrl: 'templateUrl1.html', // 需要起个服务器
    priority: 1, // 优先显示
    terminal: true // 优先级低于1的不显示
    }
    })
    .directive('child2', function() {
    return {
    restrict: 'AECM',
    template: '<div>hide</div>'
    }
    })`
    DOM结构
    dom.png

    显示结果
    rst.png
  • scope
    取值:true、false、obj。false(共享父域,默认值),true(继承父域),obj(不继承父域,新建独立作用域)。
    示例
    template
    <script type="text/html" id="s1"> <input type="text" ng-model="name"> {{ name }} </script>
    HTML
    <p> controller: <input type="text" ng-model="name"> {{ name }} </p> <p> <dt1></dt1> </p>
    一、 false:共享作用域时,指令与控制器相互作用;
    directive('dt1', function(){ return { restrict: 'E', template: function(){ return 'true:' + document.getElementById('s1').innerHTML; } } });
    输入框相互影响
    dt1.png

二、 true:继承父域时,可取到控制器内的元素,也会被影响,但不影响控制器
directive('dt1', function(){ return { restrict: 'E', scope: true, template: function(){ return 'true:' + document.getElementById('s1').innerHTML; } } });
true输入框变动不影响controller,可以得到controller内定义的值。true未改变前随着controller变动,改变后不被controller影响。

dt2.png

三、 obj:独立作用域
.controller('ctrl', function($scope){ $scope.name = 'baojian', $scope.show = function(cont) { console.log( cont ); }; });
directive('dt1', function(){ return { restrict: 'AE', scope: {}, template: function(){ return 'obj:' + document.getElementById('s1').innerHTML; } } });
1、 {},obj为{}时与controller之间无影响

dt3.png

2、 @,obj单向被controller影响,与true不同。也可以获取自定义属性的值。告诉myName取属性attrname中的值到新作用域,捋一捋这条线
directive scope = myName --> @attrname --> attrname --> {{name}} = controller scope
scope: { myName: '@attrname' }
注意是单向取值 {{ name }}
<dt attrname="{{name}}"></dt>
下面的情况@后面的字符可以省略
scope: { myName: '@myName' }
3、 =,obj与controller相互影响
directive scope = myName <--> @attrname <--> attrname <--> {{name}} = controller scope
scope: { myName: '=attrname' }
注意双向数据绑定直接用 name
<dt attrname="name"></dt>
下面的情况=后面的字符可以省略
scope: { myName: '=' }
4、 &,函数绑定
template: '<button ng-click="shw()">show</button>', scope: { shw: '&show' }
<div dt show="show(name)"></div>

  • controller、link、compile
    描述指令行为的3个参数。
    1、controller
    指令内部作用域的行为,一般绑定scope函数和变量在这里
    controller: function($scope, $element){} // 指向匿名控制器
    controller: "ctrl" // 指向控制器ctrl
    2、link
    操作DOM,绑定事件,改变样式等
    link: function(scope, elems, attrs, ctrl) { /** scope可以取到作用域内的变量 *elems是jQuery对象 *ctrl 绑定的其他指令,有可能是数组。requre连接其他指令 */ elems.bind('click', function(){ }); elems.css('background-color','blue'); }
    3、compile
    scope不可用,使用compile时link不能用。返回link函数
    compile: function(elem, attr) { return { pre: function (scope, elem, attr){}, post: function(scope, elem, attr){} } }
    compile和link比较深入的大神分析
  • controllerAs
    给controller取别名,controller中可以用this代替$scope。$scope.$watch这种不能代替
    controller: function() { this.name = 'baojian' }, controllerAs: 'bj', template: '<span>{{ bj.name }}</span>'
  • require
    请求其他指令的controller,两种匹配策略?向上(父元素)查找controller,找不到报错;?查找指令有就返回,没有就返回undefined。请求后通过link的第4个参数传入使用
    .directive('dt1', function(){
    return {
    controller: function(){
    this.name = 'baojian'
    }
    }
    });
    .directive('dt2', function(){
    return {
    require: '?^dt1'
    link: function(scope, elems, attrs, ctrl) {
    if(ctrl) {
    // 可以得到dt1的controller对象(ctrl=new dt1.controller())
    console.log( ctrl.name );
    }
    }
    }
    });
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容