【问题标题】:How can I make a firebase filter with a variable?如何使用变量制作 Firebase 过滤器?
【发布时间】:2019-09-06 08:42:01
【问题描述】:

我想从我的 Angular firebase 数据库中过滤一些东西。为此,我从 div 中读出了文本。这给了我应该过滤我的数据库的文本。我将此值传输到我的服务,我想将其用作变量并过滤此变量,但这不起作用。

这是我的服务:

cvSkillCollectionFilter: AngularFirestoreCollection<IntCvSkill>;
  cvSkillCollectionFilterAnwenden: AngularFirestoreCollection<IntCvSkill>;
  cvSkillFilter: Observable<IntCvSkill[]>;
  cvSkillFilterAnwenden: Observable<IntCvSkill[]>;

  filterWert: string;

  constructor(public afs: AngularFirestore) {

    this.filterWert = 'Entwicklung';

    this.cvSkillCollectionFilter = this.afs.collection('cv-skill', ref => ref.where('skillGruppe', '==', this.filterWert));

    this.cvSkillCollectionFilterAnwenden = this.afs.collection('cv-skill');

    this.cvSkillFilter = this.cvSkillCollectionFilter.snapshotChanges().pipe(map(changes => {
      return changes.map(a => {
        const data = a.payload.doc.data() as IntCvSkill;
        data.id = a.payload.doc.id;
        return data;
      });
    }));

    this.cvSkillFilterAnwenden = this.cvSkillCollectionFilterAnwenden.snapshotChanges().pipe(map(changes => {
      return changes.map(a => {
        const data = a.payload.doc.data() as IntCvSkill;
        data.id = a.payload.doc.id;
        return data;
      });
    }));
  }

  getSkillsGefiltert() {
    return this.cvSkillFilter;
  }

  getSkillsFilterAnwenden() {
    return this.cvSkillFilterAnwenden;
  }

  addItem(skill: IntCvSkill) {
    this.cvSkillCollectionFilter.add(skill);
  }

  filtere(filterElement: string) {
    this.filterWert = filterElement;
    console.log(this.filterWert);
  }

函数“filtere()”改变了变量“filterWert”的值。这很好用,因为当我 console.log 时,我得到了正确的值,但是 cvCollectionFilter 内部的值没有改变,我不知道为什么。

这是要过滤的属性元素的 componont.ts 文件:

skillGruppen: IntCvSkill[];
  constructor(private skillService: CvServiceService) { }

  ngOnInit() {
    this.skillService.getSkillsFilterAnwenden().subscribe(cvSkillGruppe => {
      this.skillGruppen = cvSkillGruppe;
    });
   }

   filterAnwenden(filterElement: string) {
     this.skillService.filtere(filterElement);
   }

这是应该被过滤的元素的 componont.ts 文件:

SKILLS: IntCvSkill[];

  constructor(private skillService: CvServiceService) { }

  ngOnInit() {
    this.skillService.getSkillsGefiltert().subscribe(cvSkill => {
      this.SKILLS = cvSkill;
    });
  }

这是要过滤的属性元素的 componont.html 文件:

<div>Filter Gruppen:</div>
<div *ngFor="let skillGruppe of skillGruppen">
  <div (click)="filterAnwenden(filter.textContent)" #filter>{{skillGruppe.skillGruppe}}</div>
</div>

这是应该被过滤的元素的 componont.ts 文件:

<div *ngIf="SKILLS?.length > 0; else noItem">
  <div *ngFor="let skill of SKILLS">
    <div class="skill">
      <mat-accordion>
        <mat-expansion-panel>
          <mat-expansion-panel-header>
            <mat-panel-title>{{skill.skillname}}
            </mat-panel-title>
            <mat-progress-bar class="progress-bar" [value]="skill.skillwert"></mat-progress-bar>
            <mat-panel-description>
            </mat-panel-description>
          </mat-expansion-panel-header>
          <div>{{skill.skillBeschreibung}}</div>
        </mat-expansion-panel>
      </mat-accordion>
    </div>
  </div>
</div>

<ng-template #noItem>
  <div>Keine Skills!</div>
</ng-template>

奇怪的是,当我在代码中设置我想通过 mySelf 过滤的值时,它起作用了。如何更改 cvSkillCollectionFilter 中 filterWert 变量的值?

更新: 问题是,在构造函数中我无法更新变量 filterWert。我现在正在寻找一个解决方案如何做到这一点。

【问题讨论】:

    标签: javascript angular firebase google-cloud-firestore angular7


    【解决方案1】:

    文档中有描述:Dynamic querying

    使用Subject 作为您的过滤器值并将此主题映射到您的查询。

    private filterWert$ = new Subject<string>();
    
    constructor(public afs: AngularFirestore) {
      this.cvSkillFilter = filterWert$.pipe(
        switchMap(filterWert => 
          this.afs.collection('cv-skill', ref => ref.where('skillGruppe', '==', filterWert)).snapshotChanges()
        ),
        map(changes => changes.map(a => {
          const data = a.payload.doc.data() as IntCvSkill;
          data.id = a.payload.doc.id;
          return data;
        }))
      );
    }
    
    getSkillsGefiltert() {
      return this.cvSkillFilter;
    }
    
    filtere(filterElement: string) {
      this.filterWert$.next(filterElement);
    }
    

    【讨论】:

    • 大布鲁赫势头
    【解决方案2】:

    我用管道解决了这个问题。

      transform(skills: any, skillgruppe: any): any {
        if (skillgruppe === undefined) {
          return skills;
        }
        return skills.filter(skill => {
          return skill.skillGruppe.toLowerCase().includes(skillgruppe.toLowerCase());
        });
      }
    

    所以我可以直接在 *ngFor 中进行过滤。要更改值,只需将文本作为变量发送到变量“skillGruppe”

      <div *ngIf="SKILLS?.length > 0; else noItem">
        <div *ngFor="let skill of SKILLS | filter:skillGruppe">
          <div class="skill">
            <mat-accordion>
              <mat-expansion-panel>
                <mat-expansion-panel-header>
                  <mat-panel-title>{{skill.skillname}}
                  </mat-panel-title>
                  <mat-progress-bar class="progress-bar" [value]="skill.skillwert"></mat-progress-bar>
                  <mat-panel-description>
                  </mat-panel-description>
                </mat-expansion-panel-header>
                <div>{{skill.skillBeschreibung}}</div>
              </mat-expansion-panel>
            </mat-accordion>
          </div>
        </div>
      </div>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 2016-10-18
      • 1970-01-01
      相关资源
      最近更新 更多