#angular #angular6 #angular6-json-schema-form
#angular #angular6 #angular6-json-schema-form
Вопрос:
Пытаюсь передать данные json из одного компонента в другой компонент (например, родительский к дочернему). используя сервис.У меня есть два метода в этом сервисе, один для setJsonData, а другой — для получения данных JSON.
Класс сервиса
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class XeproviderdataserviceService {
jsonData = {};
constructor() {
this.jsonData = {};
}
setXeProviderJson(val: object) {
this.jsonData = val;
console.log('setjson Data-', this.jsonData);
}
getXeProviderJson() {
return this.jsonData;
}
}
Родительский компонент
export class MainComponent implements OnInit {
active = 1;
constructor(private xeDataService: XeproviderdataserviceService) {
ngOnInit() {
}
selectTab(value, jsonData) {
this.active = value;
this.xeDataService.setXeProviderJson(jsonData);
console.log('getting', this.xeDataService.getXeProviderJson);
}
}
Дочерний компонент
import { Component, OnInit } from '@angular/core';
import { XeproviderdataserviceService } from '../xeproviderdataservice.service';
@Component({
// tslint:disable-next-line:component-selector
selector: 'xservice-tab-component',
templateUrl: './xeservice.component.html',
styleUrls: ['./xeservice.component.css']
})
export class XeserviceComponent implements OnInit {
constructor( xeDataService: XeproviderdataserviceService) {
console.log('get json Data', xeDataService.getXeProviderJson());
}
ngOnInit() {
}
}
Приведенный выше код позволяет мне устанавливать данные с помощью функции setJsonData.когда я пытаюсь получить данные с помощью метода getJsonData, он становится пустым.
я не мог понять, что я делаю неправильно…..
в браузере я вижу вот так
Комментарии:
1. используйте либо
BehaviorSubject
/Subject
внутри сервиса, и отправляйте поток в негоObservable
, и сохраняйтеsubscription
внутри вашего компонента, где вы хотите прослушать данные.2. когда я импортирую import {BehaviorSubject} из ‘rxjs / BehaviorSubject’; он показывает, что «не имеет экспортированного элемента ‘BehaviorSubject'»
3. Я думаю, в этом случае вам следует использовать @Input.
4. мне нужно передать данные json следующим образом «{id: 1, имя: «Service 1», порт: «8090», ip: «10.0 .. 4», статус: «неактивен»}» вот почему я предпочитаю сервис
5. @arj, даже для данных, подобных объекту, упомянутому выше, вы можете использовать
@Input
.
Ответ №1:
Вы можете использовать Subject для этого процесса, он будет выдавать значение для каждого триггера события. Очень простая и важная тема «Subject»
Родительский компонент
.html
<button (click)="updateName(yourValue)">Update</button>
.ts file
import { Component, OnInit } from '@angular/core';
import { XeproviderdataserviceService } from '../xeproviderdataservice.service';
export parentComponent implements OnInit {
constructor( xeDataService: XeproviderdataserviceService) {}
ngOnInit(){}
updateName(yourValue) {
this.subjectService.setXeProviderJson(yourValue);
}
В вашей службе XeproviderdataserviceService..
import { Observable, Subject } from 'rxjs';
export XeproviderdataserviceService {
subjectName : Subject<any> = new Subject<any>();
observableName$ : Observable<any> = this.subjectName.asObservable();
constructor(){}
setXeProviderJson(name) {
this.subjectName.next(name);
}
}
Дочерний компонент
import { Component, OnInit } from '@angular/core';
import { XeproviderdataserviceService } from '../xeproviderdataservice.service';
export childComponent implements OnInit {
constructor( xeDataService: XeproviderdataserviceService) {}
ngOnInit(){
this.xeDataService.observableName$.subscribe(value => {
console.log(value);
this.updatedValue = value;
})
}
Комментарии:
1. Зачем для этого нужно внедрять наблюдаемые? Я не думаю, что в столь простых случаях вам нужно внедрять rxjs.
2. мне нужно передать данные в формате json, поэтому я использую observable. Я изменил тему, теперь она работает так, как я ожидал. Спасибо @Hari
3. @arj rxjs нет необходимости отправлять json. rxjs предназначен для потоковой передачи и предоставления данных по запросу.
4. да, для простых случаев тема не требуется, ввода достаточно, но если у вас два модуля и вы используете отложенную загрузку, вам нужно отправить значение в другой модуль, в это время «Ввод» и «Вывод» завершаются ошибкой. Тема получает триггеры для каждого события пользователем, если его загрузка отложена.
Ответ №2:
В вашем родительском компоненте вы объявили сервис как частный объект private xeDataService: XeproviderdataserviceService
, но в вашем дочернем компоненте вы объявили его общедоступным xeDataService: XeproviderdataserviceService
. Они должны быть одинаковыми в обоих компонентах, и тогда они будут работать как одноэлементный объект сервиса, и тогда вы должны получить значение.