【问题标题】:Angular 2 transfer ajax call response to another componentAngular 2 将 ajax 调用响应转移到另一个组件
【发布时间】:2016-08-15 01:57:11
【问题描述】:

我刚开始玩 angular 2,但遇到了一个小问题,我搜索了各种形式和 angulars 文档。

我已经成功创建了一个调用服务,然后当我按下按钮加载另一个带有动态加载组件的组件并可以访问 ajax 结果时,我想要一个组件。

问题是我不知道该怎么做..

问题是如何使用 Observables 或 Promises 方法使结果在其他组件中可访问。

【问题讨论】:

    标签: javascript typescript angular


    【解决方案1】:

    如果我正确理解了您的问题,您正在寻找一种将数据从请求插入到另一个嵌套组件的方法。

    我希望这张图片能为您阐明本案例的数据流向。

    1. 您的 Root 组件正在调用一个服务方法,该方法为您返回 promise 对象。
    2. 然后将所需数据从响应映射到根组件构造函数中的组件模型。
    3. 您的子组件应该订阅您在上一步中准备的模型。

      ngOnInit() {
      this.dataService.getSomeData()
          .subscribe((data: IData) => {
              this.data = data;
          });
      

      }

    上面只是一个简短的例子,如何在根组件中从promise对象设置模型到本地模型。

    新研究:

    还有另一种方法可以通过来自 api 的数据来填充组件。您可以使用EventEmitter 从服务中发出事件,然后,您可以在您创建的组件中订阅此事件,这样他们就会得到一个数据,每次都会调用服务。这是第一个答案中这种策略的一个很好的例子。 Service Events

    希望对您有所帮助,如果您需要更多信息,请告诉我!

    【讨论】:

    • Mikki 谢谢,但我可以在另一个不是子组件的组件中执行此操作吗?它们是不相关的,一个通过动态组件加载注入另一个..
    • @Obretin 我不知道你的架构,有点难以理解为什么你需要这样的情况,如果你使用 ng1,我会说你应该使用event broadcasting,但 ng2 使用更严格数据流概念。因此,您可以尝试从父组件调用服务,或者可能提供更多详细信息,我会很乐意为您提供帮助:)
    • 好吧,我可能做错了,但我在页面顶部有一个搜索框,当我按下提交按钮时,我想在页面中间加载另一个组件(或者也许从一开始就加载它),在我从 API 收到答案后,用答案填充组件模板。问题是,如果我进行调用,组件会呈现但没有 ajax 调用。如果您有任何建议,请告诉我.. 对整个 Angular 2 的东西来说有点新
    • 好的,我明白了,我会在我的答案中添加一些信息。让我知道这对你没有帮助,干杯
    【解决方案2】:

    只需创建一个服务,然后将服务注入您想要的位置。 这是一个示例,如何在多个组件之间共享服务 ajax 数据而无需发出两次请求: https://stackoverflow.com/a/36413003/2681823

    服务:

    @Injectable()
    export class DataService {
        constructor(private http: Http) { }
    
        private _dataObs = new ReplaySubject<request>(1); 
    
        getData(forceRefresh?: boolean) {
        // On Error the Subject will be Stoped and Unsubscribed, if so, create another one
        this._dataObs = this._dataObs.isUnsubscribed ? new ReplaySubject(1) : this._dataObs;
    
        // If the Subject was NOT subscribed before OR if forceRefresh is requested
        if (!this._dataObs.observers.length || forceRefresh) {
                this.http.get('http://jsonplaceholder.typicode.com/posts/2')
                  .subscribe(
                    requestData => {
                      this._dataObs.next(requestData);
                    },
                    error => this._dataObs.error(error));
            }
    
            return this._dataObs;
        }
    }
    

    组件:

    @Component({
      selector: 'child',
      template : `<button (click)="makeRequest()" class="btn">Click me!</button>`
    }) 
    export class Child {
      constructor(private _dataService: DataService) {  } 
    
      makeRequest() {
        this._dataService.getData().subscribe( 
          requestData => {
              console.log('ChildComponent', requestData);
          }
      }
    }
    

    完整的 example/plunker 可以在这里找到:http://plnkr.co/edit/TR7cAqNATuygDAfj4wno?p=preview

    【讨论】:

    • Tanks @tibs,但我已经做到了.. 这就是我正在寻找的东西.. 顺便说一句,我看到有一百万种方法可以做到这一点
    • 假设您有一个表单,在提交时调用 API 响应,然后结果必须转到另一个将使用该响应的组件
    • 即使在这个来自 plunker 的示例中,我如何处理响应让我们在模板中的 *ngFor 中说
    • 您需要一个将根据 API 响应进行更新的服务。因此,在 API 响应中,您可以调用类似 service.setReponse(responseData) 的方法,并且在服务中还有另一种方法,例如 service.getResponse() 可以在您想要的地方使用。但可能需要有点不同,因为它们需要是 Observables 类型。所以你需要这样的东西stackoverflow.com/questions/33675155/…
    • 我发誓,每次我找到一些关于如何接近 Observables 和 angular 2 中的 http 主题的信息时,它看起来都不一样(到目前为止有 10 种变化)。我比以前更困惑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 2017-06-17
    • 1970-01-01
    • 2017-07-07
    • 2018-05-31
    相关资源
    最近更新 更多