使用使用 Angular 6 的服务将 JSON 文件从一个组件传递到另一个组件

Posted

技术标签:

【中文标题】使用使用 Angular 6 的服务将 JSON 文件从一个组件传递到另一个组件【英文标题】:Pass JSON file from one component to another using a service using Angular 6 【发布时间】:2019-04-04 23:40:00 【问题描述】:

在 displayresults 组件中,我试图将从 http.get() 获得的响应传递给 articleinfo 组件。 我最初是通过使用 queryParams 来执行此操作的,但我需要从我的 JSON 传递更复杂的信息,例如其他对象和数组。我正在使用 ArticleInformationService 来设置使用 this.article_info.setJSONData(response); 的响应,然后我使用 console.log(this.article_info.getJSONData()); 来确保我得到了正确的数据并且我是。但是现在当我进入 articleinfo 组件并尝试 console.log(article_info.getJSONData()); 时,我得到一个空对象。我的假设是 articleinfo 组件中的article_info 没有从 displayresults 中看到它的值,因为它是一个新实例?我这样做是否正确?

组件 1

import  Component, OnInit  from "@angular/core";
import  HttpClient  from "@angular/common/http";
import  Router, NavigationExtras  from "@angular/router";
import  ArticleInformationService  from "../article_information/article-information.service";

@Component(
  selector: "app-displayresults",
  templateUrl: "./displayresults.component.html",
  styleUrls: ["./displayresults.component.css"],
  providers: [ArticleInformationService]
)
export class DisplayresultsComponent implements OnInit 
  response: any;
  constructor(
    private http: HttpClient,
    private router: Router,
    private article_info: ArticleInformationService
  ) 

  ngOnInit() 
    this.search();
  

  search() 
    var query: string = window.location.search.substring(1).split("=")[1];

    this.http
      .get(
        "http://my.json/_search?q=" +
          query +
          "&size=100"
      )
      .subscribe(response => 
        this.response = response;
            //*******Setting the response to the service atttribute
            this.article_info.setJSONData(response);
            console.log(response);
            console.log(this.article_info.getJSONData());
          );
      

组件 2

import  Component, OnInit  from "@angular/core";
import  ActivatedRoute  from "@angular/router";
import  ArticleInformationService  from "../article_information/article-information.service";

@Component(
  selector: "app-articleinfo",
  templateUrl: "./articleinfo.component.html",
  styleUrls: ["./articleinfo.component.css"],
  providers: [ArticleInformationService]
)

export class ArticleinfoComponent implements OnInit 
  constructor(article_info: ArticleInformationService) 
    console.log(article_info.getJSONData());
  
  ngOnInit() 

服务

import  Injectable  from "@angular/core";

@Injectable(
  providedIn: "root"
)
export class ArticleInformationService 
  jsonData;
  constructor() 
    this.jsonData = ;
  
  setJSONData(val: object) 
    this.jsonData = val;
  
  getJSONData() 
    return this.jsonData;
  

【问题讨论】:

在服务中存储数据后是否调用了您的组件2?我猜你的 componet2 在你 set() 值之前调用了 get() 方法。你需要 observable 来跟踪你的价值观 【参考方案1】:

您正在重置构造函数中的 jsonData 对象,这意味着每当您实例化您的服务时,您的对象将被重置为空。

在构造函数中将 jsonData 设置为空,这应该可以解决您的问题。

 jsonData = ;
 constructor() 
 

如果您没有通过路由器进行任何刷新,上述应该可以工作。但是,我建议您使用 Observable,以处理答案here 中提到的这种情况。

【讨论】:

不幸的是它没有解决它。对象仍然是空的。 我猜你正在寻找主题***.com/questions/47573371/… 我正在使用路由器。我将从 /displayresults 转到 /article,以便显示来自 /displayresults 中的 JSON 的信息。这是我得到一个空对象的原因吗? 是的,使用上面链接中提到的主题 @BryanBastida 老兄与公认的答案有什么不同?【参考方案2】:

通过在每个类中提供服务,您将创建两个独立的服务实例。存储在第一个版本中的值在第二个版本中将不可见,反之亦然。 而是在更高级别上提供您的服务,例如在模块层上。

【讨论】:

就是这样!非常感谢!【参考方案3】:

您的异步和调用顺序似乎有问题。最好在服务类中使用BehaviorSubject 来解决这个问题。

修改后的代码在这里-

文章信息服务

import  Injectable  from "@angular/core";

@Injectable(
  providedIn: "root"
)
export class ArticleInformationService 

  private dataSource = new BehaviorSubject();
  data = this.dataSource.asObservable();

  constructor() 
    this.jsonData = ;
  
  setJSONData(val: object) 
    this.dataSource.next(val);
  
  getJSONData() 
    return this.data;
  

文章信息组件

import  Component, OnInit  from "@angular/core";
import  ActivatedRoute  from "@angular/router";
import  ArticleInformationService  from "../article_information/article-information.service";

@Component(
  selector: "app-articleinfo",
  templateUrl: "./articleinfo.component.html",
  styleUrls: ["./articleinfo.component.css"],
  providers: [ArticleInformationService]
)

export class ArticleinfoComponent implements OnInit 
  constructor(article_info: ArticleInformationService) 
    article_info.getJSONData().subscribe(data=>
        console.log(data); //<-- data is here
    );
  
  ngOnInit() 

注意:代码是用*** editor 编写的,因此可能存在typosyntactical 错误。请改正。

【讨论】:

【参考方案4】:

我认为您的组件 2 在服务返回您的组件 1 中的响应之前已加载。 您可以查看https://angular.io/guide/component-interaction 以获得一些帮助

【讨论】:

以上是关于使用使用 Angular 6 的服务将 JSON 文件从一个组件传递到另一个组件的主要内容,如果未能解决你的问题,请参考以下文章

Angular,将 JSON 对象推送到服务器

Angular2 http post没有将json对象传递给MVC 6控制器动作

Angular 6 - Ionic - 使用拦截器中断 http 请求并返回 json

Angular 6:无法使用 form.value | 检索 HTML 中的所有表单控件值json

Angular 6 更新 package.json 中过时的依赖项

在 Angular 6 项目中使用 2 tslint.json 文件