Call a compnent from a service
I have 2 component that need to communicate, and a service in the middle.
Service
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class CommunicationService {
// Observable string sources
private onOpen = new Subject<any>();
// Observable string streams
onOpen = this.onOpen.asObservable();
// Service message commands
callComponentMethod() {
this.onOpen.next();
}
}
Component A
import { Component } from '@angular/core';
import { CommunicationService } from './communication.service.ts'
@Component({
selector: 'app-comp1',
template: `
<button type="button" (click)="callMethod()">Call method from Component1</button>
`
})
export class Component1 {
constructor( private communicationService: CommunicationService ) { }
callMethod = function () {
this.communicationService.onOpen();
}
}
Component B
import { Component } from '@angular/core';
import { CommunicationService } from './communication.service.ts'
@Component({
selector: 'app-comp2',
template: ``
})
export class Component2 {
constructor( private communicationService: CommunicationService ) {
this.communicationService.onOpen.subscribe(
() => {
alert('(Component2) onOpen');
}
);
}
}
following this plunker : http://plnkr.co/edit/SmntWy0GTNdvGB5Jb3hO?p=preview the method are called but, I would like to pass a parameter. how do I do this ?
angular observable
add a comment |
I have 2 component that need to communicate, and a service in the middle.
Service
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class CommunicationService {
// Observable string sources
private onOpen = new Subject<any>();
// Observable string streams
onOpen = this.onOpen.asObservable();
// Service message commands
callComponentMethod() {
this.onOpen.next();
}
}
Component A
import { Component } from '@angular/core';
import { CommunicationService } from './communication.service.ts'
@Component({
selector: 'app-comp1',
template: `
<button type="button" (click)="callMethod()">Call method from Component1</button>
`
})
export class Component1 {
constructor( private communicationService: CommunicationService ) { }
callMethod = function () {
this.communicationService.onOpen();
}
}
Component B
import { Component } from '@angular/core';
import { CommunicationService } from './communication.service.ts'
@Component({
selector: 'app-comp2',
template: ``
})
export class Component2 {
constructor( private communicationService: CommunicationService ) {
this.communicationService.onOpen.subscribe(
() => {
alert('(Component2) onOpen');
}
);
}
}
following this plunker : http://plnkr.co/edit/SmntWy0GTNdvGB5Jb3hO?p=preview the method are called but, I would like to pass a parameter. how do I do this ?
angular observable
1
May be you can pass parameter in stream : callComponentMethod(params) { this.onOpen.next(params); }
– junk
Nov 14 '18 at 6:27
angularfirebase.com/lessons/…
– Hoax
Nov 14 '18 at 6:29
Which param you want to pass?
– User3250
Nov 14 '18 at 6:34
depends of where, right now I wish a custom typed object
– Bobby
Nov 14 '18 at 6:46
add a comment |
I have 2 component that need to communicate, and a service in the middle.
Service
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class CommunicationService {
// Observable string sources
private onOpen = new Subject<any>();
// Observable string streams
onOpen = this.onOpen.asObservable();
// Service message commands
callComponentMethod() {
this.onOpen.next();
}
}
Component A
import { Component } from '@angular/core';
import { CommunicationService } from './communication.service.ts'
@Component({
selector: 'app-comp1',
template: `
<button type="button" (click)="callMethod()">Call method from Component1</button>
`
})
export class Component1 {
constructor( private communicationService: CommunicationService ) { }
callMethod = function () {
this.communicationService.onOpen();
}
}
Component B
import { Component } from '@angular/core';
import { CommunicationService } from './communication.service.ts'
@Component({
selector: 'app-comp2',
template: ``
})
export class Component2 {
constructor( private communicationService: CommunicationService ) {
this.communicationService.onOpen.subscribe(
() => {
alert('(Component2) onOpen');
}
);
}
}
following this plunker : http://plnkr.co/edit/SmntWy0GTNdvGB5Jb3hO?p=preview the method are called but, I would like to pass a parameter. how do I do this ?
angular observable
I have 2 component that need to communicate, and a service in the middle.
Service
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class CommunicationService {
// Observable string sources
private onOpen = new Subject<any>();
// Observable string streams
onOpen = this.onOpen.asObservable();
// Service message commands
callComponentMethod() {
this.onOpen.next();
}
}
Component A
import { Component } from '@angular/core';
import { CommunicationService } from './communication.service.ts'
@Component({
selector: 'app-comp1',
template: `
<button type="button" (click)="callMethod()">Call method from Component1</button>
`
})
export class Component1 {
constructor( private communicationService: CommunicationService ) { }
callMethod = function () {
this.communicationService.onOpen();
}
}
Component B
import { Component } from '@angular/core';
import { CommunicationService } from './communication.service.ts'
@Component({
selector: 'app-comp2',
template: ``
})
export class Component2 {
constructor( private communicationService: CommunicationService ) {
this.communicationService.onOpen.subscribe(
() => {
alert('(Component2) onOpen');
}
);
}
}
following this plunker : http://plnkr.co/edit/SmntWy0GTNdvGB5Jb3hO?p=preview the method are called but, I would like to pass a parameter. how do I do this ?
angular observable
angular observable
asked Nov 14 '18 at 6:23
BobbyBobby
12610
12610
1
May be you can pass parameter in stream : callComponentMethod(params) { this.onOpen.next(params); }
– junk
Nov 14 '18 at 6:27
angularfirebase.com/lessons/…
– Hoax
Nov 14 '18 at 6:29
Which param you want to pass?
– User3250
Nov 14 '18 at 6:34
depends of where, right now I wish a custom typed object
– Bobby
Nov 14 '18 at 6:46
add a comment |
1
May be you can pass parameter in stream : callComponentMethod(params) { this.onOpen.next(params); }
– junk
Nov 14 '18 at 6:27
angularfirebase.com/lessons/…
– Hoax
Nov 14 '18 at 6:29
Which param you want to pass?
– User3250
Nov 14 '18 at 6:34
depends of where, right now I wish a custom typed object
– Bobby
Nov 14 '18 at 6:46
1
1
May be you can pass parameter in stream : callComponentMethod(params) { this.onOpen.next(params); }
– junk
Nov 14 '18 at 6:27
May be you can pass parameter in stream : callComponentMethod(params) { this.onOpen.next(params); }
– junk
Nov 14 '18 at 6:27
angularfirebase.com/lessons/…
– Hoax
Nov 14 '18 at 6:29
angularfirebase.com/lessons/…
– Hoax
Nov 14 '18 at 6:29
Which param you want to pass?
– User3250
Nov 14 '18 at 6:34
Which param you want to pass?
– User3250
Nov 14 '18 at 6:34
depends of where, right now I wish a custom typed object
– Bobby
Nov 14 '18 at 6:46
depends of where, right now I wish a custom typed object
– Bobby
Nov 14 '18 at 6:46
add a comment |
2 Answers
2
active
oldest
votes
You have quite a few things incorrect with your implementation. Here is a working example of what you want to achieve:
Example
You don't need to use Subject
, you can just use a normal observable and then "push" new values to the emitter for that observable:
export class CommunicationService {
// Observable string sources
private emitter: any;
public messageInbox: Observable<any>
constructor(){
this.messageInbox = Observable.create(e => this.emitter = e);
}
// Service message commands
public SendMessage() {
this.emitter.next("hello");
}
The code in your components was mostly ok.
stackblitz.com/edit/angular-u36nnh thanks
– Bobby
Nov 14 '18 at 7:15
Sorry again, I am using this has kind of event, but, wouldn't EventEmitter be better ? Component A and C are not related. Also, I do not see why I need emitter and message, couldn't this be done with only 1 element ?
– Bobby
Nov 14 '18 at 7:25
@Bobby Technically yes it could be a single var, however I personally think that this is a better implementation because in this case, I made theemitter
private and themessageInbox
public. So nothing outside this service can emit events - so separation of concerns. I'm sureEventEmitter
would also work fine.
– Zze
Nov 14 '18 at 7:36
add a comment |
Call callComponentMethod
function of CommunicationService
class rather than calling onOpen
. Second, if you want to pass the information you can do it through passing the value to callComponentMethod
function.
Below is the modified code
CommunicationService
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class CommunicationService {
// Observable string sources
private onOpen = new Subject<any>();
// Observable string streams
onOpen = this.onOpen.asObservable();
// Service message commands
callComponentMethod(info:any) {
this.onOpen.next(info); //<-- pass the value to subscribers
}
}
Component1
import { Component } from '@angular/core';
import { CommunicationService } from './communication.service.ts'
@Component({
selector: 'app-comp1',
template: `
<button type="button" (click)="callMethod()">Call method from Component1</button>
`
})
export class Component1 {
constructor( private communicationService: CommunicationService ) { }
callMethod = function () {
let obj = { name : "john" }; //<-- you can pass the value from callMethod
this.communicationService.callComponentMethod(obj); //<-- changed here
}
}
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53294228%2fcall-a-compnent-from-a-service%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
You have quite a few things incorrect with your implementation. Here is a working example of what you want to achieve:
Example
You don't need to use Subject
, you can just use a normal observable and then "push" new values to the emitter for that observable:
export class CommunicationService {
// Observable string sources
private emitter: any;
public messageInbox: Observable<any>
constructor(){
this.messageInbox = Observable.create(e => this.emitter = e);
}
// Service message commands
public SendMessage() {
this.emitter.next("hello");
}
The code in your components was mostly ok.
stackblitz.com/edit/angular-u36nnh thanks
– Bobby
Nov 14 '18 at 7:15
Sorry again, I am using this has kind of event, but, wouldn't EventEmitter be better ? Component A and C are not related. Also, I do not see why I need emitter and message, couldn't this be done with only 1 element ?
– Bobby
Nov 14 '18 at 7:25
@Bobby Technically yes it could be a single var, however I personally think that this is a better implementation because in this case, I made theemitter
private and themessageInbox
public. So nothing outside this service can emit events - so separation of concerns. I'm sureEventEmitter
would also work fine.
– Zze
Nov 14 '18 at 7:36
add a comment |
You have quite a few things incorrect with your implementation. Here is a working example of what you want to achieve:
Example
You don't need to use Subject
, you can just use a normal observable and then "push" new values to the emitter for that observable:
export class CommunicationService {
// Observable string sources
private emitter: any;
public messageInbox: Observable<any>
constructor(){
this.messageInbox = Observable.create(e => this.emitter = e);
}
// Service message commands
public SendMessage() {
this.emitter.next("hello");
}
The code in your components was mostly ok.
stackblitz.com/edit/angular-u36nnh thanks
– Bobby
Nov 14 '18 at 7:15
Sorry again, I am using this has kind of event, but, wouldn't EventEmitter be better ? Component A and C are not related. Also, I do not see why I need emitter and message, couldn't this be done with only 1 element ?
– Bobby
Nov 14 '18 at 7:25
@Bobby Technically yes it could be a single var, however I personally think that this is a better implementation because in this case, I made theemitter
private and themessageInbox
public. So nothing outside this service can emit events - so separation of concerns. I'm sureEventEmitter
would also work fine.
– Zze
Nov 14 '18 at 7:36
add a comment |
You have quite a few things incorrect with your implementation. Here is a working example of what you want to achieve:
Example
You don't need to use Subject
, you can just use a normal observable and then "push" new values to the emitter for that observable:
export class CommunicationService {
// Observable string sources
private emitter: any;
public messageInbox: Observable<any>
constructor(){
this.messageInbox = Observable.create(e => this.emitter = e);
}
// Service message commands
public SendMessage() {
this.emitter.next("hello");
}
The code in your components was mostly ok.
You have quite a few things incorrect with your implementation. Here is a working example of what you want to achieve:
Example
You don't need to use Subject
, you can just use a normal observable and then "push" new values to the emitter for that observable:
export class CommunicationService {
// Observable string sources
private emitter: any;
public messageInbox: Observable<any>
constructor(){
this.messageInbox = Observable.create(e => this.emitter = e);
}
// Service message commands
public SendMessage() {
this.emitter.next("hello");
}
The code in your components was mostly ok.
edited Nov 14 '18 at 10:25
answered Nov 14 '18 at 6:54
ZzeZze
9,79063767
9,79063767
stackblitz.com/edit/angular-u36nnh thanks
– Bobby
Nov 14 '18 at 7:15
Sorry again, I am using this has kind of event, but, wouldn't EventEmitter be better ? Component A and C are not related. Also, I do not see why I need emitter and message, couldn't this be done with only 1 element ?
– Bobby
Nov 14 '18 at 7:25
@Bobby Technically yes it could be a single var, however I personally think that this is a better implementation because in this case, I made theemitter
private and themessageInbox
public. So nothing outside this service can emit events - so separation of concerns. I'm sureEventEmitter
would also work fine.
– Zze
Nov 14 '18 at 7:36
add a comment |
stackblitz.com/edit/angular-u36nnh thanks
– Bobby
Nov 14 '18 at 7:15
Sorry again, I am using this has kind of event, but, wouldn't EventEmitter be better ? Component A and C are not related. Also, I do not see why I need emitter and message, couldn't this be done with only 1 element ?
– Bobby
Nov 14 '18 at 7:25
@Bobby Technically yes it could be a single var, however I personally think that this is a better implementation because in this case, I made theemitter
private and themessageInbox
public. So nothing outside this service can emit events - so separation of concerns. I'm sureEventEmitter
would also work fine.
– Zze
Nov 14 '18 at 7:36
stackblitz.com/edit/angular-u36nnh thanks
– Bobby
Nov 14 '18 at 7:15
stackblitz.com/edit/angular-u36nnh thanks
– Bobby
Nov 14 '18 at 7:15
Sorry again, I am using this has kind of event, but, wouldn't EventEmitter be better ? Component A and C are not related. Also, I do not see why I need emitter and message, couldn't this be done with only 1 element ?
– Bobby
Nov 14 '18 at 7:25
Sorry again, I am using this has kind of event, but, wouldn't EventEmitter be better ? Component A and C are not related. Also, I do not see why I need emitter and message, couldn't this be done with only 1 element ?
– Bobby
Nov 14 '18 at 7:25
@Bobby Technically yes it could be a single var, however I personally think that this is a better implementation because in this case, I made the
emitter
private and the messageInbox
public. So nothing outside this service can emit events - so separation of concerns. I'm sure EventEmitter
would also work fine.– Zze
Nov 14 '18 at 7:36
@Bobby Technically yes it could be a single var, however I personally think that this is a better implementation because in this case, I made the
emitter
private and the messageInbox
public. So nothing outside this service can emit events - so separation of concerns. I'm sure EventEmitter
would also work fine.– Zze
Nov 14 '18 at 7:36
add a comment |
Call callComponentMethod
function of CommunicationService
class rather than calling onOpen
. Second, if you want to pass the information you can do it through passing the value to callComponentMethod
function.
Below is the modified code
CommunicationService
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class CommunicationService {
// Observable string sources
private onOpen = new Subject<any>();
// Observable string streams
onOpen = this.onOpen.asObservable();
// Service message commands
callComponentMethod(info:any) {
this.onOpen.next(info); //<-- pass the value to subscribers
}
}
Component1
import { Component } from '@angular/core';
import { CommunicationService } from './communication.service.ts'
@Component({
selector: 'app-comp1',
template: `
<button type="button" (click)="callMethod()">Call method from Component1</button>
`
})
export class Component1 {
constructor( private communicationService: CommunicationService ) { }
callMethod = function () {
let obj = { name : "john" }; //<-- you can pass the value from callMethod
this.communicationService.callComponentMethod(obj); //<-- changed here
}
}
add a comment |
Call callComponentMethod
function of CommunicationService
class rather than calling onOpen
. Second, if you want to pass the information you can do it through passing the value to callComponentMethod
function.
Below is the modified code
CommunicationService
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class CommunicationService {
// Observable string sources
private onOpen = new Subject<any>();
// Observable string streams
onOpen = this.onOpen.asObservable();
// Service message commands
callComponentMethod(info:any) {
this.onOpen.next(info); //<-- pass the value to subscribers
}
}
Component1
import { Component } from '@angular/core';
import { CommunicationService } from './communication.service.ts'
@Component({
selector: 'app-comp1',
template: `
<button type="button" (click)="callMethod()">Call method from Component1</button>
`
})
export class Component1 {
constructor( private communicationService: CommunicationService ) { }
callMethod = function () {
let obj = { name : "john" }; //<-- you can pass the value from callMethod
this.communicationService.callComponentMethod(obj); //<-- changed here
}
}
add a comment |
Call callComponentMethod
function of CommunicationService
class rather than calling onOpen
. Second, if you want to pass the information you can do it through passing the value to callComponentMethod
function.
Below is the modified code
CommunicationService
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class CommunicationService {
// Observable string sources
private onOpen = new Subject<any>();
// Observable string streams
onOpen = this.onOpen.asObservable();
// Service message commands
callComponentMethod(info:any) {
this.onOpen.next(info); //<-- pass the value to subscribers
}
}
Component1
import { Component } from '@angular/core';
import { CommunicationService } from './communication.service.ts'
@Component({
selector: 'app-comp1',
template: `
<button type="button" (click)="callMethod()">Call method from Component1</button>
`
})
export class Component1 {
constructor( private communicationService: CommunicationService ) { }
callMethod = function () {
let obj = { name : "john" }; //<-- you can pass the value from callMethod
this.communicationService.callComponentMethod(obj); //<-- changed here
}
}
Call callComponentMethod
function of CommunicationService
class rather than calling onOpen
. Second, if you want to pass the information you can do it through passing the value to callComponentMethod
function.
Below is the modified code
CommunicationService
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class CommunicationService {
// Observable string sources
private onOpen = new Subject<any>();
// Observable string streams
onOpen = this.onOpen.asObservable();
// Service message commands
callComponentMethod(info:any) {
this.onOpen.next(info); //<-- pass the value to subscribers
}
}
Component1
import { Component } from '@angular/core';
import { CommunicationService } from './communication.service.ts'
@Component({
selector: 'app-comp1',
template: `
<button type="button" (click)="callMethod()">Call method from Component1</button>
`
})
export class Component1 {
constructor( private communicationService: CommunicationService ) { }
callMethod = function () {
let obj = { name : "john" }; //<-- you can pass the value from callMethod
this.communicationService.callComponentMethod(obj); //<-- changed here
}
}
edited Nov 14 '18 at 7:12
answered Nov 14 '18 at 7:06
Sunil SinghSunil Singh
6,2022626
6,2022626
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53294228%2fcall-a-compnent-from-a-service%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
May be you can pass parameter in stream : callComponentMethod(params) { this.onOpen.next(params); }
– junk
Nov 14 '18 at 6:27
angularfirebase.com/lessons/…
– Hoax
Nov 14 '18 at 6:29
Which param you want to pass?
– User3250
Nov 14 '18 at 6:34
depends of where, right now I wish a custom typed object
– Bobby
Nov 14 '18 at 6:46