求助,关于angular在指令中无法获取子元素的

求助,关于angular在指令中无法获取子元素的,第1张

因为在一个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

宁愿依赖结构,不要依赖内容

您好,在Angular中,可以使用ElementRef类来获取ngTemplate中的元素属性。ElementRef类是一个Angular服务,它提供了一种方法,可以让我们访问DOM元素,并获取其属性。要使用ElementRef类,首先需要在模块中导入它,然后在构造函数中注入它,如下所示:

constructor(private elementRef: ElementRef) {

}

接下来,可以使用ElementRef类的nativeElement属性来访问DOM元素,然后使用getAttribute()方法来获取元素的属性,如下所示:

let myElement = thiselementRefnativeElement;

let myAttribute = myElementgetAttribute('myAttribute');

这样,就可以获取ngTemplate中的元素属性了。

以上就是关于求助,关于angular在指令中无法获取子元素的全部的内容,包括:求助,关于angular在指令中无法获取子元素的、angular怎么获取ngtemplate中的元素属性、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9841788.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存