【问题标题】:Angular 2 View not displaying data from WebserviceAngular 2 View不显示来自Webservice的数据
【发布时间】:2017-06-08 15:40:54
【问题描述】:

我有一个 Web 服务,它提供一些用户数据(这是 Java 后端),我有一个 Angular 组件:

import { Component,state,style,animate,transition, trigger, keyframes, 
OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/pluck';

import { IUser } from './user.interface';

@Component({
  moduleId: module.id,
  selector: 'user-cmp',
  templateUrl: 'user.component.html'
})
export class UserComponent {

  user: Observable<IUser>;

  errorMessage: string;

  constructor(private _userService: ActivatedRoute){
    this.user = _userService.data.pluck('user');
  }

}

我正在使用解析器:

import { Resolve } from '@angular/router';
import { Observable } from 'rxjs/Observable'
import { Observer } from 'rxjs/Observer';

import { IUser } from './user.interface';
import { UserService } from './user.service';
import {Injectable} from "@angular/core";

@Injectable()
export class UsersResolver implements Resolve<IUser> {

  constructor (private _userService: UserService) {}

  resolve(): Observable<IUser>{
    return this._userService.getUser();
  }
}

解析器正在使用服务:

import {Injectable} from "@angular/core";
import { Http, Response } from "@angular/http";

import { IUser } from './user.interface';

import { Observable } from 'rxjs/Observable';

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';

@Injectable()
export class UserService {
  private _userUrl = 'http://localhost:8000/rest/users';

  constructor(private _http: Http){

  }

  getUser(): Observable<IUser>{
    return this._http.get(this._userUrl)
      .map((response: Response) => {
        return <IUser> response.json();
      })
      .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');
  }
}

最后是视图:

<div class="main-content" >
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-8">
                <div class="card" [@carduserprofile]>
                    <div class="header">
                        <h4 class="title">Edit User Profile</h4>
                    </div>
                    <div *ngIf="user" class="content">
                        <form>
                            <div class="row">

                                <div class="col-md-3">
                                    <div class="form-group">
                                        <label>Username</label>
                                        <input type="text" class="form-control" placeholder="Username" value="{{user.username }}">
                                    </div>
                                </div>
                                <div class="col-md-4">
                                    <div class="form-group">
                                        <label>Email address</label>
                                        <input type="email" class="form-control" placeholder="Email" value="{{user.password}}">
                                    </div>
                                </div>
                            </div>

                            <div class="row">
                                <div class="col-md-6">
                                    <div class="form-group">
                                        <label>Phone</label>
                                        <input type="text" class="form-control" placeholder="Phone" value="{{user.telephone}}">
                                    </div>
                                </div>
                            </div>

                            <div class="row">
                                <div class="col-md-12">
                                    <div class="form-group">
                                        <label>Type</label>
                                        <input type="text" class="form-control" disabled placeholder="User type" value="{{user.type}}">
                                    </div>
                                </div>
                            </div>
                            <button type="submit" class="btn btn-info btn-fill pull-right">Update Profile</button>
                            <div class="clearfix"></div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

模块如下所示:

import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { BrowserModule } from '@angular/platform-browser';
import { MODULE_COMPONENTS, MODULE_ROUTES } from './dashboard.routes';
import { UsersResolver } from './user/user.resolver';

@NgModule({
    imports: [
        BrowserModule,
        RouterModule.forChild(MODULE_ROUTES)
    ],
    declarations: [ MODULE_COMPONENTS ],
    providers: [ UsersResolver ]
})

export class DashboardModule{}

而且路线的一部分是这样的:

{ path: 'user', component: UserComponent, resolve: {user: UsersResolver} },

我没有粘贴一些无用的代码部分,比如动画等。 我的问题是,它使用服务中的 .do 打印来自 webservide 的数据,但在视图中没有显示任何内容。字段为空白。

如果来自 WS 的用户数据为空白,我会使用 *ngIf。

我不知道为什么,也不知道如何实现一些代码来在视图中检查它。

任何帮助都会很棒! 提前致谢。

【问题讨论】:

    标签: web-services angular typescript angular2-routing angular2-services


    【解决方案1】:

    我看到的问题位于这里:

    constructor(private _userService: ActivatedRoute){
      this.user = _userService.data.pluck('user');
    }
    

    this.user 是一个 observable,因此您需要订阅它以在组件中(使用 this.user.subscribe(...))或使用 async 管道在模板中获取值。

    也许您可以简单地利用路线的快照:

    constructor(private _userService: ActivatedRoute){
      this.user = _userService.snapshot.data['user'];
    }
    

    这样用户将是一个原始的 JS 对象,而不是一个 observable。所以使用以下应该更好:

    <div *ngIf="user" class="content">
    

    【讨论】:

    • 蒂埃里,谢谢你的回答。我按照您的建议做了,但主要问题仍然存在:视图中没有显示数据。我在组件上创建了一个方法:onClickMe() { console.log(this.user); } 只是为了测试是否至少有数据从 web 服务返回,它向用户显示。但它不会出现在视图上。还是谢谢。
    • 当我从对象的视图中删除属性时,它会显示如下一行:[object Object]。我的意思是,我不写user.email,而是写user
    猜你喜欢
    • 2016-11-17
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 2020-11-04
    • 2017-02-21
    相关资源
    最近更新 更多