获取非永久嵌套子组件的元素

Posted

技术标签:

【中文标题】获取非永久嵌套子组件的元素【英文标题】:Get element of nonpermanent nested child component 【发布时间】:2019-04-16 18:00:55 【问题描述】:

我有一个父组件,在某些操作后 ngIf 返回 true 后会调用一个子组件,并且这个子组件有一个我想要关注的 Input 元素。因为父组件没有实例化子组件,所以使用 ViewChild 似乎对我不起作用。我正在接近一个很好的策略,将这个输入集中在一个服务上,但实际上在需要时设法获得对这个输入的引用,我发现这很困难。

【问题讨论】:

你有没有尝试关注子组件的输入元素onInit()? 【参考方案1】:

您可以尝试设置输入的autofocus属性。

<input ... autofocus="true">

如果这不起作用,那么您可以创建一个指令,在创建 DOM 元素后强制输入接收焦点。这是我一直在使用的一个指令,它可以选择通过 JS 摘要延迟设置焦点,这对于一些困难的组件安排很方便。

@Directive(
    selector: '[ui-focus]'
)
export class FocusDirective implements AfterViewInit 
    /**
     * The number of javascript digestions to complete before setting focus.
     */
    @Input()
    public focusDelay: string | boolean | number = 0;

    /**
     * Conditionally control if focus should be set.
     */
    @Input()
    public focusEnabled: boolean = true;

    private counter: number;

    public constructor(private el: ElementRef) 
    

    public ngAfterViewInit(): void 
        if (Boolean(this.focusEnabled)) 
            this.counter = this.focusDelay === true ? 1 : parseInt(this.focusDelay + '', 10);
            this.setFocus();
        
    

    private setFocus() 
        if (this.counter <= 0) 
            (<htmlElement>this.el.nativeElement).focus();
         else 
            this.counter--;
            window.setTimeout(() => this.setFocus());
        
    

然后您可以将指令分配给输入控件。

<input ... ui-focus>

您不应该做任何比这更复杂的事情(即不需要服务)。

【讨论】:

我已经尝试过自动对焦属性,但情况稍微复杂一点,因为此输入可以多次出现并重新出现,并且在第一次实例之后自动对焦似乎不起作用。我会尝试一下这些其他技巧。

以上是关于获取非永久嵌套子组件的元素的主要内容,如果未能解决你的问题,请参考以下文章

聚合查询从嵌套子文档中获取最新元素的计数

如何使用Angular 6在一个输入中将多个对象发送到嵌套子组件

获取嵌套子节点javascript的文本

如何获取嵌套子查询以识别父查询列

获取 node.js 中所有嵌套子进程的标准输出

datalist嵌套子datalist获取不到ID的值