Angular 6 - 通过服务将消息从组件传递到消息组件
Angular 6 - Passing messages via service to from component to message component
我正在尝试如何传递来自 app.component.ts
的消息以显示在 messageComponent.ts
在 app.component.html
我已经添加了 <app-messagecomponent></app-messagecomponent>
添加它什么也没显示的那一刻。
我在服务中也有一个方法:
message.service.ts
message(message) {
return message;
}
所以我想通过消息服务传递来自其他组件的消息,以便它显示在应用程序中-messagecomponent.html
例如来自 app.component.ts:
sendMessageToService() {
this.myservice.message('my Message to be displayed in the messageComponent');
}
我该怎么做?
你也可以使用输入法
< app-messagecomponent [YourInputVariableName]=
"YourMessage" >> /app-messagecomponent>
在app.compnent中写入
YourMessage:any='my Message to be displayed in the messageComponent';
在应用程序中-message.component写入
@输入YourInputVariableName:any;
您可以通过 this.YourInputVariableName
在 app-messagecomponent 中打印消息
在这种情况下,要使用服务将消息从一个组件传递到另一个组件,您可以创建全局消息总线或事件总线 (publish/subscribe pattern
)。
为此,我们需要来自 [=20 的 Subject
(使用 .next()
方法发出值)和 Observable
(使用 .subscribe()
收听消息) =] 现在是 angular 6 的重要组成部分。(对于这个例子,我使用 Rxjs 6 和 rxjs-compat 包)
这里我们将使用 MessageService
class 发送一条消息,声明为 @Injectable
以作为组件的依赖项注入。从 app.component.html
单击按钮时将发出消息。将在 message.component.ts
中检索相同的消息以在 html 模板 message.component.html
中显示它。我们将在 app.component.html
.
中包含 MessageComponent
的选择器,即 <app-messagecomponent></app-messagecomponent>
下面是完整的代码
message.service.ts
import { Injectable } from '@angular/core';
import { Observable,Subject} from 'rxjs';
@Injectable()
export class MessageService {
private subject = new Subject<any>();
sendMessage(message: string) {
this.subject.next({ text: message });
}
clearMessage() {
this.subject.next();
}
getMessage(): Observable<any> {
return this.subject.asObservable();
}
}
app.component.ts
import { Component } from '@angular/core';
import { MessageService } from './message.service';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
name = 'Angular 6';
constructor(private service:MessageService){}
sendMessage(): void {
// send message to subscribers via observable subject
this.service.sendMessage('Message from app Component to message Component!');
}
clearMessage():void{
this.service.clearMessage();
}
}
app.component.html
<button (click)="sendMessage()">Click here to test message</button> <br><br>
<app-messagecomponent></app-messagecomponent>
message.component.ts
import { Component, OnDestroy } from '@angular/core';
import { Subscription } from 'rxjs';
import { MessageService } from './message.service';
@Component({
selector: 'app-messagecomponent',
templateUrl: 'message.component.html'
})
export class MessageComponent implements OnDestroy {
message: any = {};
subscription: Subscription;
constructor(private messageService: MessageService) {
// subscribe to app component messages
this.subscription = this.messageService.getMessage().subscribe(message => { this.message = message; });
}
ngOnDestroy() {
// unsubscribe to ensure no memory leaks
this.subscription.unsubscribe();
}
}
message.component.html
<p>The incoming message : </p> <br>
{{message?.text }}
如果 message
是 undefined
,这里我使用了 Elvis 运算符。
这是一个工作演示:https://stackblitz.com/edit/rxjs-snaghl
如果您正在寻找这样的东西,请告诉我。
使用ng-interconnect 库。这允许将数据从任何 angular 实体发送到另一个实体。
您可以从多个点进行广播或接收。
广播示例-
let messageStream: IMessageStream = createBroadcaster('home/stateChanged'); //Create a broadcaster```
...
...
/*Receive from it from another component somewhere in the hierarchy*/
let userReceiver = receiveFrom('home/stateChanged', 'contacts/user', (data, error, complete) => {
console.log(data);
console.log(error);
console.log(complete);
})
'''
'''
/*Broadcast messages from the first component*/
nessageStream.emit('logged-in');
我正在尝试如何传递来自 app.component.ts
的消息以显示在 messageComponent.ts
在 app.component.html
我已经添加了 <app-messagecomponent></app-messagecomponent>
添加它什么也没显示的那一刻。
我在服务中也有一个方法:
message.service.ts
message(message) {
return message;
}
所以我想通过消息服务传递来自其他组件的消息,以便它显示在应用程序中-messagecomponent.html
例如来自 app.component.ts:
sendMessageToService() {
this.myservice.message('my Message to be displayed in the messageComponent');
}
我该怎么做?
你也可以使用输入法
< app-messagecomponent [YourInputVariableName]= "YourMessage" >> /app-messagecomponent>
在app.compnent中写入
YourMessage:any='my Message to be displayed in the messageComponent';
在应用程序中-message.component写入
@输入YourInputVariableName:any;
您可以通过 this.YourInputVariableName
在 app-messagecomponent 中打印消息在这种情况下,要使用服务将消息从一个组件传递到另一个组件,您可以创建全局消息总线或事件总线 (publish/subscribe pattern
)。
为此,我们需要来自 [=20 的 Subject
(使用 .next()
方法发出值)和 Observable
(使用 .subscribe()
收听消息) =] 现在是 angular 6 的重要组成部分。(对于这个例子,我使用 Rxjs 6 和 rxjs-compat 包)
这里我们将使用 MessageService
class 发送一条消息,声明为 @Injectable
以作为组件的依赖项注入。从 app.component.html
单击按钮时将发出消息。将在 message.component.ts
中检索相同的消息以在 html 模板 message.component.html
中显示它。我们将在 app.component.html
.
MessageComponent
的选择器,即 <app-messagecomponent></app-messagecomponent>
下面是完整的代码
message.service.ts
import { Injectable } from '@angular/core';
import { Observable,Subject} from 'rxjs';
@Injectable()
export class MessageService {
private subject = new Subject<any>();
sendMessage(message: string) {
this.subject.next({ text: message });
}
clearMessage() {
this.subject.next();
}
getMessage(): Observable<any> {
return this.subject.asObservable();
}
}
app.component.ts
import { Component } from '@angular/core';
import { MessageService } from './message.service';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
name = 'Angular 6';
constructor(private service:MessageService){}
sendMessage(): void {
// send message to subscribers via observable subject
this.service.sendMessage('Message from app Component to message Component!');
}
clearMessage():void{
this.service.clearMessage();
}
}
app.component.html
<button (click)="sendMessage()">Click here to test message</button> <br><br>
<app-messagecomponent></app-messagecomponent>
message.component.ts
import { Component, OnDestroy } from '@angular/core';
import { Subscription } from 'rxjs';
import { MessageService } from './message.service';
@Component({
selector: 'app-messagecomponent',
templateUrl: 'message.component.html'
})
export class MessageComponent implements OnDestroy {
message: any = {};
subscription: Subscription;
constructor(private messageService: MessageService) {
// subscribe to app component messages
this.subscription = this.messageService.getMessage().subscribe(message => { this.message = message; });
}
ngOnDestroy() {
// unsubscribe to ensure no memory leaks
this.subscription.unsubscribe();
}
}
message.component.html
<p>The incoming message : </p> <br>
{{message?.text }}
如果 message
是 undefined
,这里我使用了 Elvis 运算符。
这是一个工作演示:https://stackblitz.com/edit/rxjs-snaghl
如果您正在寻找这样的东西,请告诉我。
使用ng-interconnect 库。这允许将数据从任何 angular 实体发送到另一个实体。
您可以从多个点进行广播或接收。
广播示例-
let messageStream: IMessageStream = createBroadcaster('home/stateChanged'); //Create a broadcaster``` ... ... /*Receive from it from another component somewhere in the hierarchy*/ let userReceiver = receiveFrom('home/stateChanged', 'contacts/user', (data, error, complete) => { console.log(data); console.log(error); console.log(complete); }) ''' ''' /*Broadcast messages from the first component*/ nessageStream.emit('logged-in');