angular – Renderer multiple selectRootElement Issue(提供plnkr)

前端之家收集整理的这篇文章主要介绍了angular – Renderer multiple selectRootElement Issue(提供plnkr)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用Renderer.selectRootElement从我的Component获取一些元素,如 here所述.

除非我只选择一个元素(plnkr),否则一切正常.

如您所见,我创建了一个组件:

  1. export class ExampleComponent implements OnInit{
  2. @Input() start: any;
  3. @Input() end: any;
  4.  
  5. constructor(public _renderer:Renderer){
  6.  
  7. };
  8.  
  9. ngOnChanges(){
  10.  
  11. }
  12. ngOnInit(){
  13. console.log("NG ON CHAN START DATE",this.start);
  14. console.log("NG ON INIT END DATE",this.end);
  15. var container = this._renderer.selectRootElement('.container');
  16. console.log(container);
  17. var inner1 = this._renderer.selectRootElement('.inner1');
  18. console.log(inner1);
  19. var inner2 = this._renderer.selectRootElement('.inner2');
  20. console.log(inner2);
  21. }
  22.  
  23. }

当我尝试运行它时,我有一个错误

EXCEPTION: The selector “.inner1” did not match any elements in [{{exampleData.end}} in MainViewComponent@3:65]

(但是,在我的应用程序中,当只找到第一个容器时,则找不到其他容器).

这有什么想法来自哪里?

UPDATE

我发现该指令未被完全调用 – 只有带有类容器的div被添加到HTML中.

不要使用selectRootElement

其目的不是在组件视图中按选择器选择随机元素.

只需在DomRootRenderer中看到它的实现

  1. selectRootElement(selector: string): Element {
  2. var el = DOM.querySelector(this._rootRenderer.document,selector);
  3. if (isBlank(el)) {
  4. throw new BaseException(`The selector "${selector}" did not match any elements`);
  5. }
  6. DOM.clearNodes(el);
  7. return el;
  8. }

你看到有趣的东西吗?它正在删除元素内的节点!为什么会这样做?因为它的目的是抓住根元素!那么哪一个是根元素?这听起来很熟悉吗?

  1. <my-app>
  2. Loading...
  3. </my-app>

是!那是根本要素.好的,但是如果我只想抓住元素,那么使用selectRootElement有什么问题?它返回没有子元素的元素,视图中没有任何变化!好吧,当然你仍然可以使用它,但是你会失败它的目的并且误用它就像人们使用DynamicComponentLoader#loadAsRoot并手动订阅EventEmitter一样.

好吧,毕竟它的名字,selectRootElement,几乎说它做什么,不是吗?

您有两种方法可以抓取视图中的元素,以及两个正确的选项.

>使用局部变量和@ViewChild

  1. <div #myElement>...</div>
  2.  
  3. @ViewChild('myElement') element: ElementRef;
  4.  
  5. ngAfterViewInit() {
  6. // Do something with this.element
  7. }

>创建一个指令来获取所需的元素

  1. @Directive({
  2. selector : '.inner1,inner2' // Specify all children
  3. // or make one generic
  4. // selector : '.inner'
  5. })
  6. class Children {}
  7.  
  8. template : `
  9. <div class="container">
  10. <div class="inner1"></div>
  11. <div class="inner2"></div>
  12.  
  13. <!-- or one generic
  14. <div class="inner"></div>
  15. <div class="inner"></div>
  16. -->
  17. </div>
  18. `
  19. class Parent (
  20. @ViewChildren(Children) children: QueryList<Children>;
  21. ngAfterViewInit() {
  22. // Do something with this.children
  23. }
  24. )

猜你在找的Angularjs相关文章