相关疑难解决方法(0)

*ngIf中的Angular 2 @ViewChild

显示模板中相应元素后获取@ViewChild最优雅的方法是什么?以下是一个例子.也有Plunker可用.

模板:

<div id="layout" *ngIf="display">
    <div #contentPlaceholder></div>
</div>
Run Code Online (Sandbox Code Playgroud)

零件:

export class AppComponent {

    display = false;
    @ViewChild('contentPlaceholder', {read: ViewContainerRef}) viewContainerRef;

    show() {
        this.display = true;
        console.log(this.viewContainerRef); // undefined
        setTimeout(()=> {
            console.log(this.viewContainerRef); // OK
        }, 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个默认隐藏其内容的组件.当有人调用@ViewChild方法时,它变得可见.但是,在角度2变化检测完成之前,我无法参考show().我通常将所有必需的操作包装成viewContainerRef如上所示.有更正确的方法吗?

我知道有一个选项setTimeout(()=>{},1),但它会导致太多无用的通话.

答案(Plunker)

angular2-changedetection angular

172
推荐指数
8
解决办法
7万
查看次数

通过 ngIf 出现后聚焦元素

我有一个按钮,当点击它时,它会被一个输入字段和一个确认按钮替换,然后当输入完成时,它会再次被原始按钮替换。发生这种情况时,我希望它在原始按钮出现后将其聚焦(一些用户要求更好地支持选项卡导航),但我似乎无法始终如一地做到这一点。我能做的最好的是:

// component.html
<button #durationButton *ngIf="!enteringDuration" (click)="enterDuration()">Enter Duration</button>
<ng-container *ngIf="enteringDuration">
    <input type="number" [(ngModel)]="duration" (keyup.enter)="setDuration()">
    <button (click)="setDuration()">&#10003;</button>
</ng-container>
Run Code Online (Sandbox Code Playgroud)
// component.ts
@ViewChild("durationButton") durationButton: ElementRef
duration: number
enteringDuration = false
shouldFocusDurationButton = false

ngAfterContentChecked () {
    if (this.shouldFocusDurationButton && this.durationButton) {
        this.shouldFocusDurationButton = false
        this.durationButton.nativeElement.focus()
    }
}

enterDuration () {
    this.enteringDuration = true
}
setDuration () {
    this.enteringDuration = false
    this.shouldFocusDurationButton = true
}
Run Code Online (Sandbox Code Playgroud)

如果我在确认按钮上单击或按下 Enter,焦点会在原始按钮出现后立即移动到原始按钮,但是如果我在输入字段中按下 Enter,按钮就会出现,但由于某种原因,在我移动鼠标之前它不会获得焦点. 我如何让它立即对两者都起作用?

focus typescript angular-ng-if angular

10
推荐指数
1
解决办法
3851
查看次数