【问题标题】:Route Parameters in Angular 2 and Express API (Get Single Post)Angular 2 和 Express API 中的路由参数(获取单个帖子)
【发布时间】:2017-04-23 19:22:28
【问题描述】:

我正在尝试使用 Angular 2 从 Express API 返回一篇文章。

Express 应用程序有这部分代码用于单个获取请求:

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(article),它会在终端中返回整个 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 中显示它。

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

谢谢

【问题讨论】:

  • 我们能看到articledetail.component.html 文件吗?另外,如果你在浏览器中打开http://localhost:3000/api/articles/11,你看到对象了吗?
  • 是的 Denko,当我在浏览器中打开 localhost:3000/api/articles/58f3e00a35737b774a7e1958 时,它会显示 JSON 对象。谢谢
  • 你试过{this.article = article}里面的console.log(article)

标签: rest api angular express mean-stack


【解决方案1】:

我实际上知道您的错误在哪里..您需要将文章初始化为空对象,因为 angular 可能会在控制台中抛出错误,它无法找到 article.title。错误可能是:找不到未定义的标题。而当 Angular 抛出这样的错误时,整个应用程序都会冻结,而你什么也做不了。所以像这样初始化文章: article: any = {} 会起作用的

另一种选择是在模板中使用“安全运算符”(?),例如 {{article?.title}}。这可以防止错误,所以如果文章未定义,它不会抛出异常,但这不是一个好习惯 rly

第三种选择是在 HTML 上添加 *ngIf,如果文章未定义,则会引发错误。像这样:

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

【讨论】:

  • 谢谢电工!那是错误,现在已经解决了。是的,控制台抛出错误:./ArticleDetailComponent 类 ArticleDetailComponent 中的错误 - 内联模板:2:12 由:无法读取未定义的属性“标题” 感谢您澄清 Denko
  • 很高兴能帮上忙 :) 如果有帮助,您可以接受答案
猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 2016-10-28
相关资源
最近更新 更多