简体   繁体   English

Angular2将API数据传递给另一个组件

[英]Angular2 passing API data to another component

TL;DR: I want to pass a variable in html template from one component to another. TL; DR:我想将html模板中的变量从一个组件传递到另一个。 Something like this is described in docs: <my-comment (blogId)="blog.id"></my-comment> and trows no error. docs: <my-comment (blogId)="blog.id"></my-comment>描述了类似的内容,并且没有错误提示。 But how to 'cach' this variable in other component? 但是如何在其他组件中“缓存”此变量? I want to pass blog Id as variable to API. 我想将博客ID作为变量传递给API。

Long version: I've made an Angular2 with two components with Parent-Child and one separate. 加长版:我制作了一个Angular2,其中包含两个带有Parent-Child组件和一个单独组件。 They are: blog list (list of post), one single post and comments. 它们是:博客列表(帖子列表),一个帖子和评论。

I try to pass a blog id retrieve from blog API to comments component and put to its API. 我尝试将从博客API检索博客ID传递给注释组件,然后放入其API。

So I have: comments.service 所以我有:comments.service

(...)    
@Injectable()
export class CommentsService {
    constructor(private http: Http) {}
        private headers = new Headers({'Content-Type': 'application/json'});

    create(body: string, author: string, date: string, post: any): Promise<Comments> {
        return this.http
            .post(API_ENDPOINT, JSON.stringify({body: body, name: author, date: date, postId: post}), {headers: this.headers})
            .toPromise()
            .then(this.extractData);
    }

    (...)
}

comments.component, where I've got a Ts error: Supplied parameters do not match any signature of call target. comments.component,出现Ts错误:提供的参数与调用目标的任何签名都不匹配。 On this line: (but application and API works fine). 在这条线上:(但是应用程序和API可以正常工作)。

this.commentsService.create(body, name, date, postId) this.commentsService.create(正文,名称,日期,postId)

import {Component, ViewEncapsulation, OnInit, OnDestroy, NgModule, Input} from '@angular/core';
import { ActivatedRoute } from '@angular/router';

import 'rxjs/add/operator/toPromise';
import {CommentsService} from "./comments.service";
import {Comments} from "./comments.model";
import {PostComponent} from '../blog/post.component';
import { BlogService } from '../blog/blog.service';

@Component({
    selector: 'my-comment',
    templateUrl: './comments.html',
    styleUrls: ['./comments.scss'],
    encapsulation: ViewEncapsulation.None,
    providers: [CommentsService]
})

@NgModule({
    declarations: [PostComponent]
})

export class CommentsComponent implements OnInit, OnDestroy {
    private postId: Comments;
    private body: Comments;
    private name: Comments;
    private date: any = new Date().toLocaleString();
    private postComponent: any = PostComponent;
    private blog: any = BlogService;

    constructor(
        private route: ActivatedRoute,
        private commentsService: CommentsService
    ) {

    }

    ngOnInit(): void {
        let id = +this.route.snapshot.params['id'];
    }

    ngOnDestroy(): void {}

    add(body: string, name: string, date: string, postId: number): void {
        body = body.trim();
        name = name.trim();
        if (!body || !postId || !name) { return; }
        this.commentsService.create(body, name, date, postId);
    }
}

Comments.html template where I want to have an blog Id variable. 我要在其中包含博客ID变量的Comment.html模板。

<div ngclass="form" class="form">
    <!--<input #name />-->
    <p ngClass="form__title">We are thrilled to hear your opinion:</p>
    <input #body ngClass="form__body" placeholder="Put your text here" />
    <input #name placeholder="Your name" />

    <button class="btn btn-1 btn-1d" (click)="add(body.value, name.value, date, ????blogPostID????); body.value=''; name.value='';">
        Add
    </button>
</div>

Blog Post are retrieved from API with Id and iterate by *ngFor in its Parent Component. 从具有ID的API中检索博客文章,并通过其父组件中的* ngFor进行迭代。 In post.component I provided a Comments Service, so this template works very well for one post (post.html): 在post.component中,我提供了注释服务,因此该模板非常适合一篇文章(post.html):

    <article *ngIf="blog" class="post">
    <header>
        <h2>{{ blog.id }}\ {{ blog?.title }}</h2>
    </header>
    <section class="article__content">
        {{ blog?.text }}
        <p class="author"> {{ blog?.name }}</p>
    </section>
    <footer>
        <a [routerLink]="['/blog']" routerLinkActive="active" class="btn btn-1 btn-1e">Return</a>
    </footer>
</article>

<section *ngIf="comments" class="comment">
    <h2>Comments:</h2>
    <main>
        <div *ngFor="let comment of comments">
            <div *ngIf="comment.postId == blog.id">
                <p>{{ comment.body }}</p>
                <p>{{ comment.postId }}</p>
            </div>
        </div>
        </main>
</section>

<my-comment></my-comment>

But I want to provide a blog.id from single post (*ngFor iterated component) to somehow. 但是我想提供从单个帖子(* ngFor迭代组件)到某种方式的blog.id。

Answer to my question was very simple but took me some time to put all together. 对我的问题的回答很简单,但花了我一些时间才能将它们放在一起。

To pass a variable to another component I use in parent template: Where is an other component and blog.id an variable to pass to. 要将变量传递给另一个组件,请在父模板中使用:另一个组件在哪里,blog.id是要传递给的变量。

    <my-comment [blogId]="blog.id"></my-comment>

In comments component I added import: 在注释组件中,我添加了导入:

export class CommentsComponent implements OnInit, OnDestroy {        
@Input() blogId:number;
...

And then I can use a blogId variable in comment template and it's a exact copy of blog.id in post component. 然后,我可以在评论模板中使用blogId变量,它是post组件中blog.id的精确副本。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM