2017-07-30 71 views
4

MD数据表没有附带主 - 细节设置。在这篇文章发布时,AM2数据表仅出现了3周。 Web上有几个关于如何为主 - 细节用途设置数据表的问题。我努力了一会儿,直到我明白了。角度材料2数据表设置为主 - 细节视图?

不同网站上的一些海报,如Data Table的GitHub网站希望能够点击一行,并且下面的行可以向下滑动以显示一些数据。数据表本身并不会这样做,也不会持续一段时间。

但是,为了查看大量的数据或编辑,然后按钮和单独的视图是好的。那么如何实现呢?

+0

改革将我的解决方案作为问题和答案,并删除了原始帖子。 – Preston

回答

2

该组件从服务组件中引入数据库的所有成员,在这种情况下使用AngularFire 2的Firebase。首先,您必须像在下面的html中的最后一列中那样引入数据库密钥。然后我用显示器隐藏它:没有CSS。最后是将行。$ key属性放入单击参数中,以将密钥字符串传递到您的代码中。简单。对于新手来说,我已经包含了我的其他代码,所以你不必花费数小时来弄清楚发生了什么。这一切正常!去建立很酷的东西!

全members.component.ts

<md-table #table [dataSource]="dataSource"> 

    <!-- First Name Column --> 
    <ng-container cdkColumnDef="firstName"> 
    <md-header-cell *cdkHeaderCellDef> Name </md-header-cell> 
    <md-cell *cdkCellDef="let row"> {{row.firstName}} </md-cell> 
    </ng-container> 

    <!-- Las Name Column --> 
    <ng-container cdkColumnDef="lastName"> 
    <md-header-cell *cdkHeaderCellDef> Name </md-header-cell> 
    <md-cell *cdkCellDef="let row"> {{row.lastName}} </md-cell> 
    </ng-container> 

    <!-- Title Column --> 
    <ng-container cdkColumnDef="mainSkillTitle"> 
    <md-header-cell *cdkHeaderCellDef> Title </md-header-cell> 
    <md-cell *cdkCellDef="let row"> {{row.mainSkillTitle}} </md-cell> 
    </ng-container> 

    <!-- Main Skills Column --> 
    <ng-container cdkColumnDef="mainSkills"> 
    <md-header-cell *cdkHeaderCellDef> Main Skills </md-header-cell> 
    <md-cell *cdkCellDef="let row"> {{row.mainSkills}} </md-cell> 
    </ng-container> 

    <!-- Delete Buttons Column --> 
    <ng-container cdkColumnDef="delete"> 
    <md-header-cell *cdkHeaderCellDef> Delete </md-header-cell> 
    <md-cell *cdkCellDef="let row"> 
     <button (click)="deleteMember(row.$key)">Delete</button> </md-cell> 
    </ng-container> 

    <!-- Edit button Column --> 
    <ng-container cdkColumnDef="edit"> 
    <md-header-cell *cdkHeaderCellDef> Edit </md-header-cell> 
    <md-cell *cdkCellDef="let row"> 
     <button (click)="goToDetailPage(row.$key)">Edit</button> </md-cell> 
    </ng-container> 

    <!-- Database key Column --> 

    <ng-container cdkColumnDef="key"> 
    <md-header-cell *cdkHeaderCellDef class="hiddenField"> Key </md-header-cell> 
    <md-cell *cdkCellDef="let row" class="hiddenField"> {{row.$key}} </md-cell> 
    </ng-container> 


    <md-header-row *cdkHeaderRowDef="displayedColumns"></md-header-row> 
    <md-row *cdkRowDef="let row; columns: displayedColumns;"></md-row> 

</md-table> 

全members.component.ts

import { Component, OnInit } from '@angular/core'; 
import { Router } from '@angular/router'; 

import { MembersAdminService } from './member-admin.service'; 
import { MembersAdminSource } from './member-admin.service'; 
import { ConfirmService } from '../../../shared/confirm.service'; 
import { Member } from './member-admin.model'; 

@Component({ 
    selector: 'app-all-members', 
    templateUrl: './all-members.component.html' 
}) 
export class AllMembersComponent implements OnInit { 

    members: Member[]; 
    private selectedId: number; 
    private result: boolean; 
    allMembers: Member[]; 


    // For MD data table. 

    private dataSource: MembersAdminSource | null; 
    private displayedColumns = [ 
     'firstName', 
     'lastName', 
     'mainSkillTitle', 
     'mainSkills', 
     'delete', 
     'edit', 
     'key' 
    ]; 


    constructor(
     private membersAdminService: MembersAdminService, 
     private router: Router, 
     private confirmService: ConfirmService 
) {} 

    ngOnInit() { 

    this.membersAdminService.getMembers() 
     .subscribe(members => { 
      this.members = members; 
      this.dataSource = new MembersAdminSource(members); 
     }); 
    } 

    goToDetailPage(selectedMemberKey) { 
    console.log('selectedMember: ', selectedMemberKey); 
    this.router.navigate(['/loggedin/admin/membersAdmin/editMember', selectedMemberKey]); 
    }; 

    deleteMember(selectedMemberKey) { 
    // Call the confirm dialog component 
    this.confirmService 
     .confirm('Confirm Delete', 'This action is final. Gone forever!') 
     // .do(); 
     .do(res => {if (res === true) { 
      this.membersAdminService.deleteMember(selectedMemberKey); 
     }}) 
     .subscribe(res => this.result = res, err => err); 
    } 

构件-admin.service.ts

import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database'; 
import { FirebaseApp } from 'angularfire2'; 
import { Inject, Injectable } from '@angular/core'; 

import { Member } from './member-admin.model'; 
import { SuccessService } from '../../../shared/success.service'; 

import { DataSource } from '@angular/cdk'; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/observable/of'; 


@Injectable() 
export class MembersAdminService { 

    private members$: FirebaseListObservable<Member[]>; 

    constructor(
     private af: AngularFireDatabase, 
     private successService: SuccessService, 

     @Inject(FirebaseApp) fb) { 
     this.members$ = af.list('Members'); 
    } 


    // Get all members. 

    public getMembers(): FirebaseListObservable<any> { 
    return this.af.list('Members', { 
     query: { 
     orderByChild: 'lastName' 
     } 
    }); 
    } 


    // Fetch member detail for member list. 

    public getMemberById(memberId: string) { 
    return this.af.object('Members/' + memberId); 
    } 

    // Create new member 

    public addMember(newMember: Member): void { 
    this.members$.push(newMember) 
     .catch(error => this.handleError(error)); 
    } 

    // Update an existing member 

    public updateMember(key: string, value: any): void { 
    this.members$.update(key, value) 
     .catch(error => this.handleError(error)); 
    } 

    // Deletes a single member and calls for success modal window. 

    public deleteMember(key: string): void { 
    this.af.object('/Members/' + key).remove() 
     .catch(error => this.handleError(error)) 
     .then(_ => this.success()); 
    } 

    private success() { 
    this.successService 
     .openDialog('Database updated as you wished!'); 
    } 

    // Default error handling for all actions 

    private handleError(error) { 
    console.log(error); 
    } 

} 

// *** MD Data Table service. *** 


export class MembersAdminSource extends DataSource<Member> { 

    constructor(private members: Member[]) { 
     super(); 
    } 


    /** Connect function called by the table to retrieve one stream containing the data to render. */ 
    connect(): Observable<Member[]> { 
     return Observable.of(this.members); 
    } 

    disconnect() {} 
} 
+0

当一行中的用户使用下面的另一个表进行扩展时,此示例是主/明细视图吗? – pantonis

+0

该主题的标题具有误导性。也许尝试将其更改为主/明细页面。通常在数据表中,主细节意味着主/细节数据表。 – pantonis

+0

pantonis - 这不是行传播细节。它提出了一个细节视图。我知道你对这个问题有很大的兴趣,但是我不需要这种类型的细节,所以没有用到它。我会检查标题,谢谢:-) – Preston