не удается получить данные из общего сервиса в angular 6

#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 . Они должны быть одинаковыми в обоих компонентах, и тогда они будут работать как одноэлементный объект сервиса, и тогда вы должны получить значение.