异步管道可观察到的角度4

异步管道可观察到的角度4

问题描述:

我是新来的角度和开始倾斜的角度4.数据没有绑定ngfor 指令在组件上使用异步管道。请帮助异步管道可观察到的角度4

用户的服务使用HTTP请求从API获取数据:

import { Injectable } from '@angular/core'; 
import { Http, Response, Headers, RequestOptions } from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/do'; 
import 'rxjs/add/operator/catch'; 
import { User } from "../Models/user"; 

@Injectable() 
export class UserService { 
constructor(private http: Http) { } 

get(url: string): Observable<User[]> { 
    return this.http.get(url) 
     .map(response => response.json() as User[]) 
     // .do(data => console.log("All: " + JSON.stringify(data))) 
     .catch(this.handleError); 
} 
private handleError(error: Response) { 
    console.error(error); 
    return Observable.throw(error.json().error || 'Server error'); 
} 
} 

我在这里使用可观察的用户

user.service.ts []接口,用于用户列表:

user.component.ts

import { Component, OnInit, ViewChild } from '@angular/core'; 
import { UserService } from '../Services/user.service'; 
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; 
import { ModalComponent } from 'ng2-bs3-modal/ng2-bs3-modal'; 
import { User } from '../Models/user'; 
import { DBOperation } from '../Shared/enum'; 
import { Observable } from 'rxjs/Observable'; 
import { Global } from '../Shared/global'; 

@Component({ 
    templateUrl: 'app/Components/user.component.html' 
}) 

export class UserComponent implements OnInit { 
    @ViewChild('modal') modal: ModalComponent; 
    users$: Observable<User[]>; 
    user: User; 
    msg: string; 
    indLoading: boolean = false; 
    userForm: FormGroup; 
    dbops: DBOperation; 
    modalTitle: string; 
    modalBtnTitle: string 

    constructor(private fb: FormBuilder, private userService: UserService) 
    { } 

    ngOnInit(): void { 
    this.userForm = this.fb.group({ 
     Id: [''], 
     UserName: ['', Validators.required], 
     Password: ['', Validators.required], 
     FirstName: ['', Validators.required], 
     LastName: ['', Validators.required], 
     Gender: ['', Validators.required] 
    }); 
    this.LoadUsers(); 
    } 
    LoadUsers(): void { 
     this.indLoading = true; 
     this.users$ = this.userService.get('http://localhost:29712/api/userapi/'); 
     this.indLoading = false; 
    } 
} 

用于异步管道订阅obs的模板ervable用户变量:

user.component.html

<div class='panel panel-primary'> 
    <div class='panel-heading'> 
     User Management 
    </div> 
    <div class='panel-body'> 
     <div class='table-responsive'> 
     <div class="alert alert-info" role="alert" *ngIf="indLoading"><img src="../../images/loading.gif" width="32" height="32" /> Loading...</div> 
     <div *ngIf='users && users.length==0' class="alert alert-info" role="alert">No record found!</div> 
     <table class='table table-striped' *ngIf='users && users.length'> 
      <thead> 
       <tr> 
        <th>First Name</th> 
        <th>Last Name</th> 
        <th>Gender</th> 
       </tr> 
      </thead> 
      <tbody> 
       <tr *ngFor="let user of users$ | async"> 
        <td>{{user.FirstName}}</td> 
        <td>{{user.LastName}}</td> 
        <td>{{user.Gender}}</td> 
       </tr> 
      </tbody> 
     </table> 
     <div> 
     </div> 
    </div> 
    <div *ngIf="msg" role="alert" class="alert alert-info alert-dismissible"> 
     <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button> 
     <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> 
     <span class="sr-only">Error:</span> 
     {{msg}} 
    </div> 
</div> 

+1

既然你订阅了,你不应该需要异步管道。 – DeborahK

+1

你的'/ api/userapi /'请求会执行两次 – yurzui

+0

我会检查response => response.json(),因为IUser []解析为null。你确定服务响应与你的IUser相同的数据结构吗? –

由于您使用异步。尝试删除susbcribe。在您的原始代码上。这里有一个类似的video。使用$作为Observable属性非常有用...

+1

然后他应该改变这个部分'让用户| async'以及模板中。 – yurzui

+0

由于this.users为'Observable 'Type – Sajan

+0

FYI:https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines - Don类型'IUser'不能分配给Type'Observable '不要把我的接口或_用于私人实例...我通常也把$放在变量的末尾来表明它是可观察的。所以我会让用户的用户$ |异步并更改类 – JGFMK

您的* ngIf问题无法直接检查您的可观察长度而无需异步管道。试试这个吧,

*ngIf="(users$ | async)?.length==0" 
+0

但长度为0意味着没有数据,它会调用另一个http调用 – yurzui

+0

我会解决异步管道一次通过使用'用户$ | async as users' – yurzui

+0

为什么它调用一个更多的api。当ngOnInit运行时,this.loads函数会触发,它将调用api。 –