在AngularFire 5

时间:2018-05-05 18:46:18

标签: angularfire angularfire5

我有以下与AngularFire 5配合使用的代码:

export class NavigationComponent {
    items: Observable<any[]>;
    constructor(db: AngularFireDatabase) {
        this.items = db.list('/pages', ref => {
            let query = ref.limitToLast(100).orderByChild('sortOrder');
            return query;
        }).valueChanges();
    }
}

但是现在需要返回item.$key,这显然在AngularFire 5中默认不再返回。我在迁移指南中提到需要“映射”这个,但似乎无法获得正确的语法处理上述代码。

更新:遵循以下建议,似乎有效,但新旧行为之间似乎仍存在一些差异。

<nav class="nav-standard">
    <app-logo></app-logo>
    <div class="nav-dropdown">
        <ul *ngFor="let item of items | async | filter : 'parent' : '00000000-0000-0000-0000-000000000000'" class="nav-dropdown">
            <li>
                <a mat-button class="mat-button" href="{{item.path}}" data-id="{{item.key}}" target="{{item.target}}" title="{{item.tooltip}}"  [attr.data-sort]="item.sortOrder" *ngIf="item.content; else elseBlock">{{item.menuText}}</a>
                <ng-template #elseBlock>
                    <a mat-button class="mat-button" data-id="{{item.key}}" target="{{item.target}}" title="{{item.tooltip}}">{{item.menuText}}</a>
                </ng-template>
                <ul class="nav-dropdown-content">
                    <li *ngFor="let childItem of items | async | filter : 'parent' : item.key" class="">
                        <a class="mat-button" href="{{childItem.path}}" data-id="{{childItem.key}}" target="{{childItem.target}}" title="{{childItem.tooltip}}" [attr.data-sort]="childItem.sortOrder">{{childItem.menuText}}</a>
                    </li>
                </ul>
            </li>
        </ul>   
    </div>
</nav>

嵌套的* ngFor似乎永远不会发生,而在此之前。看来嵌套的* ngFor中的 items null ??我发现如果我在我的组件中创建了一个名为childItems的另一个Observable并为其指定了重复的逻辑,它可以正常工作 - 但对我来说这感觉很脏而且错了。如何让observable中的数据保持足够长的时间以便在嵌套的* ngFor中使用它?

1 个答案:

答案 0 :(得分:1)

新的AngularFire API更改后,

项密钥信息不再“免费”。而不是使用'.valueChanges()'将引用转换为Observable,您可以使用'.snapshotChanges()':

    .snapshotChanges()
    .map(changes => {
      return changes.map(change => ({key: change.payload.key, ...change.payload.val()}));
    })

从那时起,你可以使用'item.key'来引用项目键(注意你不能使用'$ key')。