
可以,Angular获取父组件传值-set,get
子组件或指令中的 @Input() 装饰器表示该属性可以从其父组件中获取值。
要想监视 @Input() 属性的变化,你可以使用 Angular 的生命周期钩子OnChanges
但上述方法,对于接收到的值都是,收到就使用。
如果想对接收到参数进行一些处理 ,或者是根据参数执行不同 *** 作。
这个时候可以使用set和get方法。
上图是Alert的效果,可以动态的添加和删除里面的alert标签。通过阅读源码可以看出,这个指令把alert封装出来了一个uib-alert指令。通过$attr服务,把uib-alert指令中的属性设置传递到指令中。大家写指令的时候可以借鉴一下。
下面是源码:
把后端返回数据为null或者空或者undefined的用斜杠替换
思路:一开始的时候我是想写一个服务,双循环数据,把数据转变成斜杠,这样就减少了在页面处理逻辑,后来经过同事的建议,还是决定写一个指令,因为所使用的这个系统为考核系统,里面除了d窗,几乎都是用table写的,所以决定在table上写一个指令,遍历下面所有的td,当td绑定的数据为null或者空或者undefined的时候替换成斜杠,这样就不需要每次都依赖注入一遍说来惭愧,从事前端9个月,这是我第一次自己写指令加油!
一 遍历table知识点
1 rows 集合返回表格中所有行(TableRow 对象)的一个数组,即一个 HTMLCollection。
该集合包括 、 和 中定义的所有行。
2cells 集合返回表格中所有单元格的一个数组
二 指令知识点
1scope作用域 一招制敌 - 玩转 AngularJS 指令的 Scope (作用域) - 技术风暴 - SegmentFault 思否 可以参考这篇文章
三种形式
默认 false 从父级作用域继承,双向绑定,改变一方的内容,另一方也会跟着变化
true 也是从父级作用域继承,和false的区别在于当指令里的数据改变时,父级作用域的数据不会改变,但是父级作用域改变时,子级会发生改变
{ },可以简单的理解为自定义作用域,=表示双向绑定,@符表示单向绑定,&符绑定函数
怎么传参&表现形式
restrict:String,E(元素)<my-directive></my-directive>
A(属性,默认值) <div my-directive="expression"></div>
C(类名)<div class="my-directive:expression"></div>
M(注释)<--directive:my-directive expression-->
三 注意点
1需要在table表格ng-repert完成后再执行指令,简单的说就是要数据渲染完再执行指令,需要在指令里写timeout
2还有就是$watch监控数据变化,在页面渲染完成后再去执行指令,但是当没有数据或者数据为空的时候则不需要执行指令
下面是改良版,最近其实在学习dom *** 作的视频,但是一开始写指令的时候下意识的就去百度了怎么遍历table,然后双循环被吐槽了,emmmm
因为在一个directive被link的时候,其内部的directive,是还没有被执行的。
对于ng-model这类的directive还好,那个元素是还在的。
而对于ng-repeat而言则不一样,为了优化,让ng-repeat只被compile一次,它会在compile阶段把这个节点摘除掉,单独compile一次,然后在发生数据绑定的时候对每个实例单独进行link。
用楼上同学的$timeout大法的确是可以的,不过个人不是很建议,因为这样就变成单次绑定了。
你这样获取子元素对于angular来说是非常不建议的,身为一个男人,你必须对ng-repeat的后果负责(雾),它是动态绑定的,意味着它里面的内容会变,如果你只获取一次,那它变了,你没响应,就是不负责任的表现。另一个,你的父directive里对其内容有依赖,这是非常糟糕的实践。
angular给你了一个监听变化的机会,是通过对数据变化的监听。其实是可行的,但是我也不建议这么用。一是在$watch当中你需要维护一个元素它是新的还是旧的,比如避免重复绑事件。二是这样对于$scope里的数据字段结构依然是耦合的,而且也没有解决DOM结构依赖的问题,你的父directive还是没有复用性可言。
所以个人建议如果一个directive是作为容器,那么它不应该对任何它的内容有依赖。如果是作为装饰者,应只作用于元素本身,而不作用于其子元素。
那么如果想实现一个轮播图slides怎么办?很明显slides的内容是很适合通过ng-repeat动态绑定的,我现在希望如果定义一个slides组件,它的内容就会被以轮播图的形式展现。这时候很明显是组件对其内容有依赖。
这里参考angular-ui-bootstrap当中的tabset实现举个例子:再定义一个名为slide-item的directive,在它的声明当中require: '^slides',这样变成了子组件依赖父组件。在slides当中定义add, remove, select等API,在slide-item被link的时候调用其父的add来修改数据,并且再通过转交transclude函数的方式把自己的内容交给slides来处理。这样做到了:
1、slides可以动态包含任意多的slide-item
2、slide-item可以transclude任意的内容
从依赖关系上看,slide-item依赖slides完全没问题,声明了require还能在compile阶段得到angular的保护。slides要求其子元素必须用slide-item进行一次(几乎是透明的)包装,换来的是完全的动态绑定,也可以接受。与此同时,每一个slide-item只会被link一次,还能避免$watch的重复绑定事件这类问题,在它被transclude的时候读取它的DOM内容也是可行的。
(不过我还是要吐槽一下ui-bootstrap的tabset实现,因为为了最终用户代码简洁,生成的最终DOM结构和组件树相差甚远,中间transclude来transclude去的,不过也是为了将就bootstrap)。
总之,对于构建一套组件而言:
子组件可以依赖父组件,父组件不要依赖子组件
宁愿依赖数据,不要依赖DOM
宁愿依赖结构,不要依赖内容
组件 是带有模板的真正指令,它是这三种指令中最常见的也是实际开发中用的最多的。
属性指令 用于改变元素的外观和行为。例如, ngStyle 指令可以同时改变一个元素的多个样式,我们通过把他绑定到一个组件的属性上实现文本加醋,字体为斜体,颜色设置为石灰绿等效果。
结构指令 *** 作DOM元素来改变DOM的布局, *** 纵DOM 是一个单页面页面(SPA)。3个常见内置结构指令。
unlessdirectivets (excerpt) :
通过angularjs获取html元素id没有直接的方法,因为id是一个dom *** 作。
Angular不会帮助用户获得DOM的某个属性。如果需要使用的是DOM选择器,不管是原生的也好或者像jQuery这样的库也好。
官方说法:不能在控制器里面做DOM *** 作,那我就把DOM *** 作相关的代码放到指令里面好了这种做法确实是好一些了,但是通常还是是错误的。
以上就是关于angular服务中可以写getset吗全部的内容,包括:angular服务中可以写getset吗、angular-ui-bootstrap中Alert指令的源码解析、我的第一个angular指令,遍历table下的td,替换数据格式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)