在属性指令中使用 DoCheck

Using DoCheck in attribute directive

我创建了一个简单的应用程序,使用 ngFor 从数组创建一系列按钮。单击按钮时,它的值被推送到第二个数组。

我有一个属性指令 disable,它使用 DoCheck() 侦听对数组的更改,并禁用其值已存在于数组中的任何按钮,以防止它被多次添加。

一切正常,但有更好的方法吗? Angular 2 网站建议谨慎使用 DoCheck()

查看

<ul>
  <li *ngFor="let myitem of myitems">{{ myitem }}
    <a href="#" (click)="deleteItem(myitem)"> x</a>
  </li>
</ul>
<button *ngFor="let item of items" (click)="addItem(item)" [disable]="myitems">{{item}}</button>

属性指令

@Directive({
  selector: '[disable]'
})
export class DisableDirective implements DoCheck {
  @Input('disable') myitems : string[];

  constructor(private el: ElementRef, private renderer: Renderer) { }

  ngDoCheck() {
      if(this.myitems.find(item => item === this.el.nativeElement.innerText)) {
        this.renderer.setElementProperty(this.el.nativeElement, 'disabled', true);
        this.renderer.setElementClass(this.el.nativeElement, 'disabled', true);
      } else {
        this.renderer.setElementProperty(this.el.nativeElement, 'disabled', false);
        this.renderer.setElementClass(this.el.nativeElement, 'disabled', false);
      }
  }
}

您可以绑定到 button[disabled] 属性。在您的控制器中创建一个函数 isButtonDisabled(button) 从模板中传递项目。

<button 
  *ngFor="let item of items" 
  (click)="addItem(item)"
  [disable]="myitems" 
  [disabled]="isButtonDisabled(item)"
> 
 {{item}} 
</button>

在函数内部,检查项目是否已经被推入第二个数组。

如果是,return true 按钮将被禁用。

而不是使用 directive 为什么不在您的组件中执行检入 addItem() 方法。

DoCheck() 方法的用途应该有限,因为每次更改检测周期 运行 时它都会 运行。所以你必须小心使用它。

最好使用 OnChanges() 而不是 DoCheck() 作为前 运行 仅当 input 属性发生变化时。

你可以试试:

 export class MyComponent implents OnChanges{

    addItem(item) {

    if(this.myitems.find(item => item === this.el.nativeElement.innerText)) {
            this.renderer.setElementProperty(this.el.nativeElement, 'disabled', true);
            this.renderer.setElementClass(this.el.nativeElement, 'disabled', true);
          } 
else {
            this.renderer.setElementProperty(this.el.nativeElement, 'disabled', false);
            this.renderer.setElementClass(this.el.nativeElement, 'disabled', false);
          }
      }
    }

ngOnChanges() {
this.addItem(item);
}

在您的情况下,您可以跳过使用 directive

如果真的想使用directive,那么将所有逻辑从DoCheck()转移到OnChanges()