简体   繁体   English

使用* ngIf获取数据-Angular2

[英]Getting data using *ngIf - Angular2

I'm trying to get data i have fetched from my web-api, to show in my html. 我正在尝试获取从我的Web API获取的数据,以显示在html中。 I have one component for listing events and second for detail event. 我有一个组件用于列出事件,第二个用于详细事件。

when i click the event, the page routes to my new url+id, but i get noting in my detailpage. 当我单击事件时,页面将路由到我的新url + id,但我在我的detailpage中注意到了。 ngIf is supposed to work here, and the listEvent component works just fine. ngIf应该可以在这里工作,listEvent组件也可以正常工作。

This is what i get: detailEvent 这就是我得到的: detailEvent

eventDetail.html eventDetail.html

<li *ngIf="Ievents">
{{event.id}}
<h2>works</h2>

eventDetail.ts eventDetail.ts

import 'rxjs/add/operator/switchMap';
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Params } from '@angular/router';
import { Location } from '@angular/common';

import { DataService, Ievents } from '../dataService';

@Component({
  moduleId: module.id,
  selector: 'event-detail',
  templateUrl: './eventDetail.component.html',
  styleUrls: ['./eventDetail.component.css']
})
export class EventDetailComponent implements OnInit {
  event: Ievents;

  constructor(
    private dataService: DataService,
    private route: ActivatedRoute,
    private location: Location
  ) { }

  ngOnInit(): void {
    this.route.params
        .switchMap((params: Params) => this.dataService.getEvent(+params['id']))
        .subscribe(event => this.event = event);
    console.log(this.event);
  }

}

eventsList.ts eventsList.ts

import 'rxjs/add/operator/switchMap';
import { Observable } from 'rxjs/Observable';
import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute, Params } from '@angular/router';
import { Subscription } from 'rxjs/Subscription';

import { DataService, Ievents } from '../dataService';



 @Component({
   moduleId: module.id,
   selector: 'showevents',
   template: require('./showEvents.component.html'),
   styleUrls: ['./showEvents.component.css'],
   providers: [DataService]          
 })
 export class ShowEventsComponent implements OnInit {

   events: Observable<Ievents[]>;
   private selectedId: number;



   constructor(
     private service: DataService,
     private route: ActivatedRoute,
     private router: Router
   ) { }


   ngOnInit() {
     this.events = this.route.params
        .switchMap((params: Params) => {
            this.selectedId = +params['id'];
            return this.service.getEvents();
        });
   }

   isSelected(event: Ievents) {
     return event.id === this.selectedId;
   }

   onSelect(event: Ievents) {
     this.router.navigate(['/detail', event.id]);
   }

eventList.html eventList.html

<div class="container-fluid">
  <h2>Hendelser</h2>
  <ul class="events">
    <li *ngFor="let event of events | async"
        [class.selected]="isSelected(event)"
        (click)="onSelect(event)">
        <span class="badge">{{ event.id }}</span> {{ event.category.name }}
    </li>
  </ul>
</div>

DataService.ts DataService.ts

import { Http, Response, RequestOptions, Headers } from '@angular/http';
import 'rxjs/add/operator/map'
import { Observable, Subject } from 'rxjs/Rx';
import { Injectable } from '@angular/core';
import 'rxjs/add/operator/toPromise';





 @Injectable()
 export class DataService {

   constructor(private _http: Http) { }
   private RegenerateData = new Subject<number>();
   private actionUrl = 'http://localhost:53708/api/';


   getCategories(): Promise<Icategories[]> {
     return this._http.get(this.actionUrl + "categories")
        .toPromise()
        .then(response => this.extractArray(response))
        .catch(this.handleErrorPromise);
   }



   getEvents(): Promise<Ievents[]> {
     return this._http.get(this.actionUrl + "events")
        .toPromise()
        .then(response => this.extractArray(response))
        .catch(this.handleErrorPromise);
   }

   getEvent(id: number): Promise<Ievents> {
     const url = `${this.actionUrl + "events" }/${id}`;
     return this._http.get(url)
        .toPromise()
        .then(response => response.json().data as Ievents)
        .catch(this.handleErrorPromise);
   }


   Add(model) {
     let headers = new Headers({
        'Content-Type':
        'application/json; charset=utf-8'
     });
     let options = new RequestOptions({ headers: headers });
     delete model["id"];
     let body = JSON.stringify(model);
     return this._http.post(this.actionUrl + "events", body,
        options).toPromise().catch(this.handleErrorPromise);
   }





   protected extractArray(res: Response, showprogress: boolean = true) {
     let data = res.json();
     return data || [];
   }

   protected handleErrorPromise(error: any): Promise<void> {
     try {
        error = JSON.parse(error._body);
     } catch (e) {
     }

     let errMsg = error.errorMessage
        ? error.errorMessage
        : error.message
            ? error.message
            : error._body
                ? error._body
                : error.status
                    ? `${error.status} - ${error.statusText}`
                    : 'unknown server error';

     console.error(errMsg);
     return Promise.reject(errMsg);
   }
 }

 export interface Ievents {
   id: number,
   name: string,
   whathh: string,
   category: string,
   tlf: string
 }

 export interface Icategories {
   id: number;
   name: string;
 }
<li *ngIf="event">

You want to check if your component variable event is set, nothing else! 您要检查是否设置了组件变量event ,仅此而已! :) :)

You could do it also like this: 您也可以这样:

<li>
{{event?.id}}
<h2>works</h2>

Another hint: 另一个提示:

  ngOnInit(): void {
    this.route.params
        .switchMap((params: Params) => this.dataService.getEvent(+params['id']))
        .subscribe(event => {
           this.event = event;
           console.log(this.event); // print it here !
        });

  }

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

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