ng-select 的焦点不工作 Angular 5

focus for ng-select not working Angular 5

我正在尝试在 angular 5 中为 ng-select 使用焦点,但它不起作用

我正在与 ng2-select

合作

如何在 Angular 5 中为 ng-select 使用焦点?

<label class="input">
   <input (blur)="goTo()" type="text">
</label>

<label class="select" >
    <div *ngIf="items.length > 0" >
       <ng-select     #select [items]="items">
       </ng-select>
    </div>
</label>





@ViewChild('select') myElement: ElementRef;

    goTo(){
      this.myElement.element.nativeElement.focus();
    }

改变这个

goTo(){
  this.myElement.element.nativeElement.focus();
}

对此,

import { ChangeDetectorRef } from '@angular/core';

constructor (private cRef: ChangeDetectorRef) {}

// import 'SelectComponent' from your library for 'ng2-select'
goTo(){
  let el = null;
  if (this.items.length > 0) {
    this.cRef.detectChanges();
    el = (this.myElement.nativeElement as SelectComponent).element.nativeElement.querySelector('div.ui-select-container > input');
    if (el) { el.focus(); }
  }
}

您可能需要检查元素是否已定义(或者您是否需要额外的 'nativeElement',但我基本上是在重用 here.[=13 中的逻辑=]

只是一个警告,如果库更新以重命名这些 类 或修改模板,这可能不是一个稳定的修复。

希望对您有所帮助。

快速回复,在此解决方案中,每个 select 元素都被记录下来以供将来使用(在本例中为模糊)。这需要根据您的情况进行调整。

import { Component, OnInit } from '@angular/core';
import { ViewChildren, QueryList } from '@angular/core';
@Component({
  selector: 'app-editor',
  templateUrl: './editor.component.html',
  styleUrls: ['./editor.component.css']
})


export class EditorComponent implements AfterViewInit {

// Viewchildren
// https://netbasal.com/understanding-viewchildren-contentchildren-and-querylist-in-angular-896b0c689f6e
myindex:number;

@ViewChildren("select") inputs: QueryList<any>

constructor() { 
  this.myindex=0
}

// You will have to setup some input parameters in this function in order to switch to the right "select", (you have control)
private goTo() 
{
// focus next input field
if (this.myindex +1 < this.inputs.toArray().length)
  {
  this.inputs.toArray()[this.myindex +1].nativeElement.focus();
  this.myindex = this.myindex + 1;
  }
else {
  this.inputs.toArray()[0].nativeElement.focus();
  this.myindex = 0;
}
}

private processChildren(): void {
  console.log('Processing children. Their count:', this.inputs.toArray().length)
}

  ngAfterViewInit() {
    console.log("AfterViewInit");
    console.log(this.inputs);
    this.inputs.forEach(input => console.log(input));

    // susbcribe to inputs changes, each time an element is added (very optional feature ...)
    this.inputs.changes.subscribe(_ => 
      this.processChildren() // subsequent calls to processChildren
  );
}


  

}

这对我来说很好,

@ViewChild('ngSelect') ngSelect: NgSelectComponent;
ngAfterViewInit() {
        if (this.autofocus) {
            setTimeout(() => {
                this.ngSelect.focus();
            });
        }
    }

参考https://github.com/ng-select/ng-select/issues/762

一个简单的方法,你也可以这样做。

<label class="input">
   <input (blur)="goTo(select)" type="text">
</label>

<label class="select">
    <div *ngIf="items.length > 0">
       <ng-select #select [items]="items">
       </ng-select>
    </div>
</label>

并在 Typescript 文件中。

goTo(select){
   select.focus();
}