javascript - Angular 4 - 如何让管道触发编程值更改(无键盘事件)

标签 javascript angular angular2-directives angular2-pipe

这是我的第一个 angualr 项目。我正在更新元素点击的输入值。当这个值改变时,我想触发过滤管道。触发管道的逻辑在指令中。这可能吗?

组件

<input id="filter-careers" placeholder="type your title here" type="text" [(ngModel)]="term" value="">

 <div class="vacancy {{vacancy.department}}" *ngFor="let vacancy of vacancies | filter:term"
       (click)="openModalContent(vacancy.description, vacancy.positionTitle, vacancy.department, vacancy.link)">
      <p>{{vacancy.positionTitle }}</p>
  </div>

第二个组成部分

<div class="department" *ngFor="let department of departments" appDepartmentsDirective [departmentName]="department.name" >

      <div class="icon" [ngStyle]="{background: 'url(' + '../../assets/' + department.link + '.png' + ') center center no-repeat'}">
        <img src="../../assets/{{department.link}}.svg" />
      </div>
    </div>

指令

import { Directive, HostListener, Input  } from '@angular/core';

@Directive({
  selector: '[appDepartmentsDirective]'
})

export class DepartmentsDirectiveDirective {

  @Input() departmentName:string;

  constructor() { }



  @HostListener('click') click() {
    console.log('department name: ' + this.departmentName);
    if((<HTMLInputElement>document.getElementById('filter-careers'))){
      console.log('do something here to trigger the filtering');

      (<HTMLInputElement>document.getElementById('filter-careers')).value = this.departmentName;
      (<HTMLInputElement>document.getElementById('filter-careers')).focus();

    }
    else{
      console.log('do something else');
    }

  }

}

最佳答案

默认情况下,管道只有在传递的值或参数发生变化时才会重新执行。如果值或参数是对象,则只有不同的对象实例被识别为更改,不会识别从数组中添加/删除值或修改对象的属性。

如果您使管道不纯,每次运行更改检测时都会执行它。这可能会导致严重的性能问题。

一个简单的技巧是将额外的参数传递给管道

*ngFor="let vacancy of vacancies | filter:term:dummy"

并且每次你想要重新执行管道时,修改dummy

dummy:number = 0;

someHandler() {
  this.vacancies.push(someValue);
  this.dummy++;
}

关于javascript - Angular 4 - 如何让管道触发编程值更改(无键盘事件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45959964/

相关文章:

javascript - 我可以在 MediaWiki wiki 上使用 jquery.uls 从英语语言名称中获取语言代码吗?

javascript - Slice() 不适用于二维数组

javascript - 我可以在 React 中跨多个树共享一个组件实例吗?

Angular(2) - 使用 CLI 运行两个项目

css - 如何在 Angular 2 中更改应用程序范围的 css?

javascript - javascript中这两种编写函数的方式之间的区别

typescript - 在 Visual Studio 中使用 angular2

angular - Tomcat 重写Cond

angular - 表单内的多个子组件 - Angular 2

Angular 2 : How to capture all user event