Angular 2 和 Express API 中的路由参数(Get Single Post)

Route Parameters in Angular 2 and Express API (Get Single Post)

我正在尝试 return 来自 Express API 的一篇文章,使用 Angular 2.

Express 应用程序有这段代码用于单个 get 请求:

router.get('/articles/:articleId', (req, res) => {

  let articleId = req.params.articleId;

  Article.findById(articleId, (err, article) => {
    if(err) {
        res.send(err);
    } else {
        res.json(article)
    }
  });

});

如果我这样做 console.log(文章),它 return 是终端中的整个 JSON 对象,所以它可以工作。

接下来,文章服务如下所示:

import { Injectable } from '@angular/core';
import { Http, Headers } from '@angular/http';
import 'rxjs/add/operator/map';

@Injectable()
export class ArticleService {

  constructor( private http:Http ) { 
    console.log('Article service initialized...')
  }

  getArticles() {

  }

  getArticle(id) {
    return this.http.get('http://localhost:3000/api/articles/'+id)
      .map(res => res.json());
  }

  addArticle(newArticle){

  }

  deleteArticle(id){
    return this.http.delete('http://localhost:3000/api/articles/'+id)
        .map(res => res.json());
  }

}

使用上面的代码 deleteArticle(id) 有效。

最后,ArticleDetailComponent 如下所示:

import { Component, OnInit } from '@angular/core';
import { ArticleService } from '../services/article.service'; 
import { Router, ActivatedRoute, Params } from '@angular/router';
import { ArticleComponent } from '../article/article.component'
import 'rxjs/add/operator/switchMap';

@Component({
      selector: 'app-articledetail',
      templateUrl: './articledetail.component.html',
      styleUrls: ['./articledetail.component.css']
})

export class ArticleDetailComponent implements OnInit {

      article: ArticleComponent;
      title: string;
      text: string;

      constructor( 
        private router: Router,
        private route: ActivatedRoute, 
        private articleService:ArticleService){   

        }

        ngOnInit() {
            var id = this.route.params.subscribe(params => {
                var id = params['id'];

                this.articleService.getArticle(id)
                    .subscribe(article => {this.article = article});

                    console.log(id) //returns article id correctly
            });

        }
}

articledetail.component.html 看起来像这样:

    <div class="article-container">
        <div class="col-md-12">
            <h2>{{article.title}}</h2>
            {{article.text}}
            <br><br>
        </div>
    </div>

当我 运行 应用程序时,我可以获取文章列表并按 Id 删除文章,但我无法在 ArticleDetailComponent 中显示单个文章。

如果我在 ArticleDetailComponent 中执行 console.log(id) 它会显示文章 ID,但我无法在响应中获取 JSON 对象并将其显示在 HTML.

有人可以告诉我缺少什么吗?

谢谢

我真的明白你的错误在哪里..你需要将文章初始化为空 object,因为 angular 可能会在控制台中抛出它找不到 article.title 的错误。错误可能是:找不到未定义的标题。当 angular 抛出这样的错误时,整个应用程序就会冻结,您将无能为力。所以像这样初始化文章: article: any = {} 它会起作用

另一种选择是在模板中使用 "safe operator" (?) {{article?.title}}。这可以防止错误,所以如果文章未定义,它不会抛出异常,但这不是一个好的做法 rly

第三种选择是在 HTML 上添加 *ngIf,如果 article 未定义则抛出错误。像这样:

 <div class="article-container" *ngIf="article">
        <div class="col-md-12">
            <h2>{{article.title}}</h2>
            {{article.text}}
            <br><br>
        </div>
 </div>