我正在尝试使用Angular构建一个空闲的rpg游戏。我有一个控制台日志,显示诸如“造成的伤害/获得的经验”之类的事件。
我有一个服务调用MessageService,其中有一个类型为Message(文本,日期,类型)的数组属性。
import { Message } from "@core/models/message";
import { Injectable } from "@angular/core";
import { MESSAGE } from "@core/constant/constant";
@Injectable({
providedIn: "root"
})
export class MessageService {
messages: Message[] = [];
private add(message: String, type: string) {
this.messages.push(new Message(message, type));
}
addGeneralMessage(message: String) {
this.add(message, MESSAGE.GENERAL);
}
addCombatMessage(message: String) {
this.add(message, MESSAGE.COMBAT);
}
clear() {
this.messages = [];
}
constructor() {}
}
我在控制台日志上有按钮,允许用户“过滤”所有消息以仅获取特定类型(战斗/常规/系统)。
我可以使用:messages.filter(message => message.type == type)进行过滤,我不能做的就是不断获取所选类型的新消息。
import { Message } from "@core/models";
import { MESSAGE } from "@core/constant/constant";
import { MessageService } from "@core/services";
import { Component, OnInit } from "@angular/core";
@Component({
selector: "app-message",
templateUrl: "./message.component.html",
styleUrls: ["./message.component.scss"]
})
export class MessageComponent implements OnInit {
messages: Message[];
constructor(public messageService: MessageService) {}
ngOnInit() {
this.messages = this.messageService.messages;
}
filterByType(type: String) {
if (type == MESSAGE.ALL) {
this.messages = this.messageService.messages;
} else {
this.messages = this.messageService.messages.filter(
item => item.type == type
);
}
}
}
任何主意吗?我尝试使用可观察的方法没有成功,我认为我可能无法很好地实现它。
编辑:我的消息组件看起来像这样:
<div class="log">
<app-message-button-menu
(filter)="filterByType($event)"
></app-message-button-menu>
<app-message-chat [messages]="messages"></app-message-chat>
</div>
我的应用信息按钮按钮菜单:
<div class="menuLog">
<app-message-button
[text]="'All'"
[type]="MESSAGE.ALL"
[active]="activeButton == MESSAGE.ALL"
(messageType)="onFilter($event)"
></app-message-button>
<app-message-button
[text]="'General'"
[type]="MESSAGE.GENERAL"
[active]="activeButton == MESSAGE.GENERAL"
(messageType)="onFilter($event)"
></app-message-button>
<app-message-button
[text]="'Fight'"
[type]="MESSAGE.COMBAT"
[active]="activeButton == MESSAGE.COMBAT"
(messageType)="onFilter($event)"
></app-message-button>
<app-message-button
[text]="'System'"
[type]="MESSAGE.SYSTEM"
[active]="activeButton == MESSAGE.SYSTEM"
(messageType)="onFilter($event)"
></app-message-button>
</div>
import { Component, OnInit, Output, EventEmitter, Input } from "@angular/core";
@Component({
selector: "app-message-button",
templateUrl: "./message-button.component.html",
styleUrls: ["./message-button.component.scss"]
})
export class MessageButtonComponent implements OnInit {
@Input() type: String;
@Input() text: String;
@Input() active: boolean;
@Output() messageType = new EventEmitter<String>();
constructor() {}
ngOnInit() {}
filter() {
this.messageType.emit(this.type);
}
}
import { Component, OnInit, Output, EventEmitter, Input } from "@angular/core";
@Component({
selector: "app-message-button",
templateUrl: "./message-button.component.html",
styleUrls: ["./message-button.component.scss"]
})
export class MessageButtonComponent implements OnInit {
@Input() type: String;
@Input() text: String;
@Input() active: boolean;
@Output() messageType = new EventEmitter<String>();
constructor() {}
ngOnInit() {}
filter() {
this.messageType.emit(this.type);
}
}
我的应用消息按钮,如:
<button [ngClass]="{ active: active == true }" (click)="filter()" type="button">
{{ text }}
</button>
import { Component, OnInit, Output, EventEmitter, Input } from "@angular/core";
import { MESSAGE } from "@core/constant/constant";
@Component({
selector: "app-message-button-menu",
templateUrl: "./message-button-menu.component.html",
styleUrls: ["./message-button-menu.component.scss"]
})
export class MessageButtonMenuComponent implements OnInit {
MESSAGE;
activeButton: String;
@Output() filter = new EventEmitter<String>();
constructor() {}
ngOnInit(): void {
this.MESSAGE = MESSAGE;
this.activeButton = MESSAGE.ALL;
}
onFilter(type: String) {
this.activeButton = type;
this.filter.emit(type);
}
}
这是我的app-message-chat:
<ul>
<app-message-item
*ngFor="let message of messages; trackBy: trackBy"
[message]="message"
></app-message-item>
</ul>
import { Component, OnInit, Input } from "@angular/core";
import { Message } from "@core/models/message";
@Component({
selector: "app-message-chat",
templateUrl: "./message-chat.component.html",
styleUrls: ["./message-chat.component.scss"]
})
export class MessageChatComponent implements OnInit {
@Input("messages") messages: Message[];
constructor() {}
ngOnInit(): void {}
trackBy(index: number, item: Message): Message {
return item;
}
}
应用类似的可观察对象:
MessageService
import { Message } from "@core/models/message";
import { Injectable } from "@angular/core";
import { MESSAGE } from "@core/constant/constant";
@Injectable({
providedIn: "root"
})
export class MessageService {
messages: Message[] = [];
filteredMessages: ReplaySubject<Message[]>;
filter: string;
private add(message: String, type: string) {
this.messages.push(new Message(message, type));
this.filterMessages();
}
addGeneralMessage(message: String) {
this.add(message, MESSAGE.GENERAL);
}
addCombatMessage(message: String) {
this.add(message, MESSAGE.COMBAT);
}
clear() {
this.messages = [];
}
setFilter(filter: string) {
this.filter = filter
}
filterMessages(): Observable<Message[]> {
if (!filteredMessages) filteredMessages = new ReplaySubject(1);
this.filteredMessages.next(this.messageService.messages.filter(
item => item.type === filter
));
return this.filteredMessages;
}
constructor() {}
}
并在组件中进行订阅。组件中的属性必须为Observable<Message[]>
。之后,您可以将其与* ngIf和async
管道]一起使用>
• 使用sybase sp_who时的存储过程和应用过滤条件
• 我可以在 FROM 子句中调用存储过程吗 - MYSQL,如果不能,有什么选择?
• 在并行 Flink DataStream 中应用多个过滤器
• RTK QUERY With React 如何根据查询参数重新获取查询?
• 如何修复错误消息(sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用 0,并且提供了 1。)
• 在 Powershell 中过滤 REST API PowerBI 的结果
• 将非常大的数据并行发送到 api 并在 promise.allSettled 中捕获错误
• Acumatica 对 LastModifiedDateTime / Filtering 的实现