กรองรายการตามหมวดหมู่ - เชิงมุม 8

ฉันมีรายการจาก firebase ที่ฉันต้องการกรองและแสดงความเชี่ยวชาญพิเศษในแต่ละหมวดหมู่ เมื่อฉันทำบันทึกคอนโซล ทั้งหมวดหมู่และความเชี่ยวชาญพิเศษจะถูกดึงข้อมูล แต่ฉันไม่สามารถเข้าใจได้ว่าฉันต้องทำอะไรเพื่อแสดงความเชี่ยวชาญพิเศษใน UI เมื่อเลือกหมวดหมู่ คำแนะนำใด ๆ จะได้รับการชื่นชม ขอบคุณ. ด้านล่างเป็นงานของฉัน:

ผลลัพธ์ของโครงการ

การออกแบบการรวบรวมฐานข้อมูล

Category.JSON

{ "-Lq2PAU_P-fPniAMrQ85" : { "name" : "test" }, "accountingFinance" : { "name" : "การบัญชีและการเงิน" }, "AssuranceAudit" : { "name" : "Assurance and Audit" }, "riskManagement" : { "ชื่อ" : "การบริหารความเสี่ยง" }, "ภาษี" : { "ชื่อ" : "ภาษี" } }

หมวดหมู่ JSON

{
  "accountingFinance" : [ null, "Accounting Management Information Systems", "Accounting Records Maintenance", "Accounts Preparation", "Accountancy / Finance Training" ],
  "assuranceAudit" : [ null, "Asset Management Review", "Assurance / Audit Training", "Climate Change / Sustainability Audit", "Enviromental Audit" ],
  "riskManagement" : [ null, "Acturial Service", "Enterprise Risk Management", "Fraud Risk Management", "Political Risk Management" ],
  "taxation" : [ null, "Business Income Tax", "Capital Gains Tax", "Corporation Tax", "Employee Tax (PAYE)", "Export Incentives" ]
}

มาร์กอัป HTML

<div class="row">
                            <div class="col-4">
                                <div class="list-group">
                                    <a 
                                        *ngFor="let c of (category$ | async)" 
                                        routerLink="/admin/expert-category" [queryParams]="{ category: c.key }"
                                        class="list-group-item list-group-item-action"
                                        [class.active]="category === c.key">
                                        {{ c.name }}
                                    </a>
                                </div>
                            </div>
                            <div class="col">
                                <div class="row">
                                    <ng-container *ngFor="let categories of filteredCategories; let i = index">
                                        <div class="col">
                                            <div class="card">
                                                <!--<div class="card-body">-->
                                                    <ul class="list-group list-group-horizontal">
                                                        <li class="list-group-item">{{ categories }}</li>
                                                    </ul>
                                                <!--/div>-->
                                            </div>
                                        </div>
                                        <div  *ngIf="(i+1) % 4 === 0" class="-w-100"></div>
                                    </ng-container>     
                                </div>
                            </div>
                        </div>

บริการ.ts

getCategories(): Observable<any[]> {
    return this.db.list('/categories')
    .snapshotChanges().pipe(
      map(actions =>
        actions.map(data => ({ key: data.key, ...data.payload.val() }))
    ));
  }

  getAll(): Observable<any[]> {
    return this.db.list('/category')
    .snapshotChanges().pipe(
      map(category =>
        category.map(cat => {
            const key = cat.key;
            const payload = cat.payload.val();
            return { key, ...payload };
          })),
        );
  }

ไฟล์ Component.ts

export class ExpertCategoryComponent implements OnInit {
  category$;
  category: string;
  closeResult: string;
  filteredCategories: any[] = [];
  specialization: any[] = [];

  constructor(
    private categoryService: CategoryService,
    route: ActivatedRoute,
    private router: Router,
    private modalService: NgbModal) {

      this.categoryService.getCategories().subscribe(specialization => {
        this.specialization = specialization;
        console.log(this.specialization);
        route.queryParamMap.subscribe(params => {
          this.category = params.get('category');

          this.filteredCategories = (this.category) ? this.specialization.filter(s => s.category === this.category) : this.specialization;
          console.log(this.filteredCategories);
          });
      });

      this.category$ = this.categoryService.getAll();
  }

ฉันไม่ได้รับข้อผิดพลาดใดๆ ในขณะนี้ ยกเว้นอาร์เรย์ว่างในคอนโซลเมื่อฉันเลือกหมวดหมู่


person E. Ogony    schedule 04.10.2019    source แหล่งที่มา
comment
วิธีที่ดีที่สุดคือใช้ไปป์แบบกำหนดเองเพื่อกรองสิ่งใดๆ   -  person Mises    schedule 04.10.2019
comment
@Mises ไม่เป็นไปตามเอกสารของพวกเขา: angular.io/guide/pipes# ภาคผนวก-no-filterpipe-หรือ-orderbypipe   -  person peinearydevelopment    schedule 04.10.2019
comment
ฉันไม่เห็น category ในตัวอย่าง JSON ของคุณ แต่คุณใช้ใน (s.category)   -  person Maihan Nijat    schedule 04.10.2019
comment
bitbucket.org/ mises543/sorting-list/src/master/src/app/shared/ ไปป์นี้จัดเรียงตามหมวดหมู่/แบบสอบถาม/จัดเรียงตัวอักษรตามชื่อและเวลา   -  person Mises    schedule 04.10.2019
comment
@peinearydevelopment ไปป์แบบกำหนดเองไม่ใช่บิวด์ allredy   -  person Mises    schedule 04.10.2019
comment
@peinearydevelopment งานเห็นไหม ? sorting-list-angular.web.app/library   -  person Mises    schedule 04.10.2019
comment
เราคาดหวังสินค้ากี่รายการจากการโทรครั้งนี้   -  person Saksham    schedule 04.10.2019
comment
ฉันกำลังนำสิ่งที่ได้เรียนรู้จากบทช่วยสอนไปใช้จริงในโปรเจ็กต์ของตัวเอง ฉันเป็นมือใหม่ในเรื่องนี้ ดังนั้นกรุณาบอกฉันด้วยหากช้า นี่เป็นตัวอย่าง JSON ที่สองของฉันสำหรับ s.category   -  person E. Ogony    schedule 04.10.2019
comment
{ -Lq2PAU_P-fPniAMrQ85 : { ชื่อ : test }, การบัญชีการเงิน : { ชื่อ : การบัญชีและการเงิน }, AssuranceAudit : { ชื่อ : การรับประกันและการตรวจสอบ }, การจัดการความเสี่ยง : { ชื่อ : การจัดการความเสี่ยง }, ภาษี : { ชื่อ : ภาษี } }   -  person E. Ogony    schedule 04.10.2019
comment
ฉันขอโทษสำหรับรูปแบบรหัสที่แย่มาก ฉันจะจัดรูปแบบโค้ดในความคิดเห็นได้อย่างไร   -  person E. Ogony    schedule 04.10.2019
comment
@peinearydevelopment sorting-list-agon.web.app/library ใกล้เคียงกับสิ่งที่ฉันต้องการบรรลุ แต่ฉันไม่เห็นรหัสใด ๆ คุณช่วยกรุณาชี้ให้ฉันทราบว่าฉันสามารถหามันได้ที่ไหน   -  person E. Ogony    schedule 04.10.2019
comment
จะพยายามเพิ่มโค้ดในช่วงสุดสัปดาห์   -  person peinearydevelopment    schedule 04.10.2019
comment
@Maihan Nijat เมื่อคุณพูดถึง (s.category) ไม่อยู่ในไฟล์ JSON ของฉัน ฉันรู้ว่าฉันมีปัญหาในการแสดงผล UI เนื่องจากการออกแบบฐานข้อมูลที่ไม่ดี ฉันได้แก้ไขโค้ดของฉันเพื่อรวมโมเดลไว้ด้วย และขอให้คุณลองดูและให้คำแนะนำด้วย ฉันยังไม่พบวิธีแก้ปัญหาใด ๆ ขอบคุณ   -  person E. Ogony    schedule 06.10.2019
comment
@Mises ฉันเพิ่ม StackBlitz แสดงให้เห็นว่าเหตุใดจึงไม่แนะนำให้ใช้ไปป์สำหรับสิ่งนี้   -  person peinearydevelopment    schedule 08.10.2019
comment
@peinearydevelopment น่ารู้ แต่ไปป์ของฉันยังคงบริสุทธิ์และทริกเกอร์เฉพาะเมื่อ sortBy หรือการเปลี่ยนแปลงตัวกรองใด ๆ เท่านั้น จึงไม่ทำลายประสบการณ์การใช้งาน   -  person Mises    schedule 08.10.2019
comment
@Mises นั่นเป็นเรื่องจริง แต่เอกสารบอกว่าไปป์ต้องไม่บริสุทธิ์เพราะมันอ้างอิงคุณสมบัติของวัตถุ ของคุณไม่ได้เหมือนกับที่คุณได้ฮาร์ดโค้ดไว้ในไปป์นั้นเอง (เช่น title, uploaded) นั่นคือสิ่งที่สำคัญที่จะเน้น   -  person peinearydevelopment    schedule 08.10.2019
comment
@peinearydevelopment ใช่ฉันรู้และมีตัวเลือกในการทำให้ชั้นเรียนเป็นครั้งสุดท้ายใช่ไหม ชอบที่จะทำให้มันขยายไม่ได้ ?   -  person Mises    schedule 08.10.2019
comment
@peinearydevelopment เพราะบางคนสามารถขยายท่อที่ไม่บริสุทธิ์ของเขาด้วยท่อคัดแยกของฉัน   -  person Mises    schedule 08.10.2019
comment
@Mises ดูปัญหา GitHub   -  person peinearydevelopment    schedule 08.10.2019
comment
@E.Ogony หากคุณลองใช้โค้ดด้านล่างแต่ไม่ได้ผล โปรดอัปเดตคำถามของคุณด้วยรายละเอียด ยังดีกว่าคือจัดหา StackBlitz ของคุณเองเพื่อที่ฉันจะได้ดำเนินการเปลี่ยนแปลงที่คุณต้องการเพื่อให้สิ่งต่าง ๆ ทำงานได้   -  person peinearydevelopment    schedule 08.10.2019
comment
@ peinearydevelopment ฉันขอขอบคุณสำหรับความกังวลของคุณ กรุณาค้นหาลิงค์ไปยังโครงการ หากเป็นการถามที่ไม่มากเกินไป คุณช่วยยกตัวอย่างที่ใช้บริการเพื่อดึงข้อมูลจาก firebase DB ได้ไหม stackblitz.com/edit/angular-99tvpd? ฝัง=1&file=src/app/   -  person E. Ogony    schedule 11.10.2019


คำตอบ (1)


ฉันได้สร้าง StackBlitz ด้วยโค้ด

มีการแก้ไข html ที่คุณให้ไว้ด้านบนเล็กน้อย นอกจากนี้ยังมีการเยาะเย้ย 'firebase' เพื่อให้คุณเห็นว่าฉันกำลังใช้ข้อมูลที่คุณให้ไว้ด้านบนเช่นกัน คุณอาจต้องการดูตัวอย่างเต็มที่นั่น

นอกจากนี้ วิธีการต่างๆ มากมายที่ใช้ด้านล่างนี้มาจากวิทยากรที่น่าทึ่งอย่าง Deborah Kurata และอื่นๆ .

เกี่ยวกับคำถามของคุณเกี่ยวกับการกรอง

import { Component } from '@angular/core';
import { FirebaseStub } from './firebase.stub';
import { Observable, BehaviorSubject, Subject } from 'rxjs';
import { mergeMap, map, tap } from 'rxjs/operators';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  name = 'Angular';
  private selectedCategory = new BehaviorSubject<string>('accountingFinance');

  category$: Observable<any>;
  selectedCategory$ = this.selectedCategory.asObservable();
  categories$: Observable<any>;


  constructor(private firebaseStub: FirebaseStub) {
    this.categories$ = this.selectedCategory$
                           .pipe(
                             mergeMap(selectedCategory => this.firebaseStub
                                                              .categories$
                                                              .pipe(map((category: any) => category[selectedCategory]))
                            )
                          );

    this.category$ = firebaseStub.category$
                                 .pipe(
                                   tap((category: any) => this.selectedCategory.next('accountingFinance')),
                                   map(categoryObj => Object.keys(categoryObj).map((key,index) => categoryObj[key].name))
                                  );
  }
}

ฉันพยายามรักษาแบบแผนการตั้งชื่อของคุณ แม้ว่าจะยากสำหรับฉันที่จะปฏิบัติตามก็ตาม คุณจะเห็นว่า categories$ เป็นรายการหมวดหมู่ที่กรองแล้วตามรายการทั้งหมดที่ได้รับจาก 'firebase' และ selectedCategory โดยทั่วไป ฉันเห็นว่าค่า SelectedCategory มาจากดรอปดาวน์ใน UI และเมื่อผู้ใช้เลือกค่าใหม่ การเลือกนั้นจะเริ่มต้นวิธีการอัปเดต SelectedCategory (โดยการเรียก next) ฉันได้ฮาร์ดโค้ดค่าที่นี่อีกครั้ง เนื่องจากนี่ไม่ใช่ประเด็นหลักของคำถามของคุณ

การกรองจะดำเนินการผ่านตัวดำเนินการ rxjs mergeMap ใช้ค่าล่าสุดที่ปล่อยออกมาจาก selectedCategory$ ที่สังเกตได้ผ่านไปยังตัวดำเนินการ map ที่เป็น piped ผ่าน categories$ ที่สังเกตได้ของ Firebase หมวดหมู่ที่กรองที่แมปจะถูกส่งกลับเป็น categories$ ที่สังเกตได้ของส่วนประกอบ

อัปเดต

เพียงอ้างอิงถึงความคิดเห็นบางส่วนเกี่ยวกับคำถามเริ่มต้น ฉันสร้าง StackBlitz แสดงให้เห็นถึงความไร้ประสิทธิภาพบางประการโดยใช้แนวทางไปป์ที่ไม่บริสุทธิ์ หากคุณเปิดคอนโซลในบานหน้าต่างแสดงตัวอย่าง คุณสามารถดูได้ว่ามีการเรียกใช้ไปป์ที่ไม่บริสุทธิ์กี่ครั้ง แม้ว่าจะเกี่ยวข้องกับการกระทำที่ไม่เกี่ยวข้องกันโดยสิ้นเชิงก็ตาม แต่ละครั้งที่ถูกเรียก UI จะถูกเรนเดอร์ใหม่

person peinearydevelopment    schedule 07.10.2019