- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 AngularFire2 创建一个简单的聊天应用程序。用户登录到 facebook 并将他们的个人资料信息保存到 users/uid。然后,每次用户发送聊天时,它都会将他们的 UID 与消息一起发送。我正在尝试将 UID 映射到当前有效的用户信息。但是,当我添加/删除消息时,一些数据会闪烁,并且似乎正在重新呈现,而不是仅仅使用新信息进行更新。更具体地说,任何不是我自己的个人资料信息都会刷新。我什至不确定为什么我的不闪烁,因为它们都以相同的方式来自 Firebase。有人知道如何修复闪烁吗?
chat.service.ts
import { Injectable } from '@angular/core';
import { AngularFire, FirebaseListObservable } from 'angularfire2';
import { Observable } from 'rxjs';
import 'rxjs/Rx';
@Injectable()
export class ChatService {
chat_list$: Observable<any>;
items$: FirebaseListObservable<any>;
constructor(public af: AngularFire) {
this.items$ = af.database.list('/items', {
query: { limitToLast: 15, orderByKey: true}
});
this.chat_list$ = this.items$.map(chats => {
console.log('chats: ', chats);
return chats.map(chat => {
if ( chat.sender !== af.database.object(`users/${chat.uid}`) ) {
chat.sender = af.database.object(`users/${chat.uid}`);
}
return chat;
});
});
}
}
home.component.ts
import { Component } from '@angular/core';
import { AuthService } from '../services/auth.service';
import { ChatService } from '../services/chat.service';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.scss']
})
export class HomeComponent {
name: string;
message: string;
constructor(public auth: AuthService, public chat: ChatService) {
auth.isLoggingIn = false;
}
onMessageSend(form){
console.log('form submit: ', form);
this.chat.items$.push(form);
this.message = '';
}
removeChat(chat_key){
this.chat.items$.remove(chat_key);
}
}
home.component.html
<div class="container m-t-1">
<div class="row">
<div class="col-xs-12">
<h1>Quick Chat App</h1>
<button class="btn btn-danger pull-right" (click)="auth.signout()">Sign Out</button>
</div>
</div>
<form (ngSubmit)="onMessageSend(sendForm.value)" #sendForm="ngForm">
<ul class="m-t-1">
<li *ngFor="let chat of chat.chat_list$ | async">
<img src="{{ (chat.sender | async)?.photo }}" alt="{{ (chat.sender | async)?.name }}'s profile picture">
<span class="message">{{ chat.message }}</span> <span class="tag tag-primary m-l-1">{{ (chat.sender | async)?.name }}</span>
<span class="tag tag-danger" (click)="removeChat(chat.$key)">X</span>
</li>
</ul>
<div class="input-group m-t-1">
<input name="message" [(ngModel)]="message" type="text" class="form-control" placeholder="Enter message..." autocomplete="off" required>
<span class="input-group-btn">
<button class="btn btn-primary" type="submit"><i class="fa fa-send-o"></i></button>
</span>
</div>
<label for="message" class="pull-right posting-as">Posting as {{auth.user.name}}</label>
<input type="hidden" name="uid" [(ngModel)]="auth.user.uid">
</form>
</div>
最佳答案
我第二次尝试简化我的第一个答案时效果更好。检查一下,我仍然会看看它是否可以进行任何优化。
chat.service.ts
import { Injectable } from '@angular/core';
import { AngularFire, FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2';
import { Observable } from 'rxjs';
import 'rxjs/Rx';
@Injectable()
export class ChatService {
chat_list: Array<any>;
chat_list$: Observable<any>;
chat_senders$: any = {};
items$: FirebaseListObservable<any>;
constructor(public af: AngularFire) {
this.items$ = af.database.list('/items', {
query: { limitToLast: 15, orderByKey: true}
});
this.chat_list$ = this.items$.map(chats => {
chats.map(chat => {
this.chat_senders$[chat.uid] = af.database.object(`users/${chat.uid}`);
this.chat_senders$[chat.uid].subscribe((sender) => {
chat.sender = sender;
});
return chat;
});
return chats;
});
}
}
home.component.html
<div class="container m-t-1">
<div class="row">
<div class="col-xs-12">
<h1>Quick Chat App</h1>
<button class="btn btn-danger pull-right" (click)="auth.signout()">Sign Out</button>
</div>
</div>
<form (ngSubmit)="onMessageSend(sendForm.value)" #sendForm="ngForm">
<ul class="m-t-1">
<li *ngFor="let chat of chat.chat_list$ | async">
<img src="{{ chat.sender?.photo }}" alt="{{ chat.sender?.name }}'s profile picture">
<span class="message">{{ chat.message }}</span> <span class="tag tag-primary m-l-1">{{ chat.sender?.name }}</span>
<span class="tag tag-danger" (click)="removeChat(chat.$key)">X</span>
</li>
</ul>
<div class="input-group m-t-1">
<input name="message" [(ngModel)]="message" type="text" class="form-control" placeholder="Enter message..." autocomplete="off" required>
<span class="input-group-btn">
<button class="btn btn-primary" type="submit"><i class="fa fa-send-o"></i></button>
</span>
</div>
<label for="message" class="pull-right posting-as">Posting as {{auth.user.name}}</label>
<input type="hidden" name="uid" [(ngModel)]="auth.user.uid">
</form>
</div>
关于具有嵌套 Observable/FirebaseObjectObservable 的 Angular2 ngFor 在更新时闪烁一些数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40028119/
我知道在其他情况下我可以使用 unsubscribe() 关闭可观察对象,但据我所知 FirebaseObjectObservable 似乎没有该功能。我怎样才能将其关闭? this.rock = t
我知道在其他情况下我可以使用 unsubscribe() 关闭可观察对象,但据我所知 FirebaseObjectObservable 似乎没有该功能。我怎样才能将其关闭? this.rock = t
所以我在下面的代码中获取了 FirebaseObjectObservable。但路径是动态的,因为它可能还没有。因此,如果路径不存在,我想创建该路径。但如果它存在,我想更新/修补数据。 this.
代码: (转换不适用于这两种方法) 1. this.af.database.object('/users/'+key) .do((something:any)=>console.l
我有一个关于在 Firebase 中处理多对多关系的问题。基本上,我正在尝试从 Firebase 数据内部的多个路径构建用户配置文件对象。我尝试构建一个返回可观察值的函数,然后在嵌套可观察值从 Fir
我在使用 angularfire2 时遇到 typescript 编译错误: Property 'take' does not exist on type 'FirebaseObjectObserva
我正在尝试使用 AngularFire2 创建一个简单的聊天应用程序。用户登录到 facebook 并将他们的个人资料信息保存到 users/uid。然后,每次用户发送聊天时,它都会将他们的 UID
我已将我的 ionic 应用程序从 beta 11 更新到 rc0。所以这意味着我已经从 typescript 1.8 切换到 2。 我已经根据这个网站配置了AngularFire2 Getting
我是一名优秀的程序员,十分优秀!