Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度2 rc1组件初始化_Angular_Angular2 Template - Fatal编程技术网

Angular 角度2 rc1组件初始化

Angular 角度2 rc1组件初始化,angular,angular2-template,Angular,Angular2 Template,我正在试验Angular 2 rc1,它有一个非常简单的组件。 如图所示,它失败: import { Component, OnInit } from '@angular/core'; import { Http, Response } from '@angular/http'; import { Observable } from 'rxjs/Observable'; import { Movie } from "./movi

我正在试验Angular 2 rc1,它有一个非常简单的组件。 如图所示,它失败:

import { Component, OnInit }    from '@angular/core';
import { Http, Response }       from '@angular/http';
import { Observable }           from 'rxjs/Observable';
import { Movie }                from "./movie";
import { MovieService }         from "./movieService";

import "rxjs/add/operator/map";

@Component
({
    selector: 'my-app',
    template: `
        <p>{{mov.Rating}}</p>
        <ul>
          <li *ngFor="let movie of movies" >
            {{movie.Title}} - {{movie.Rating}}
          </li>
        </ul>
        `,
    providers: [MovieService]
})

export class AppComponent implements OnInit
{
    public name: string;
    public mov: Movie;// = { Title: "bla", Rating: 3 };
    public movies: Movie[];

    constructor(private movieService: MovieService) {}

    public ngOnInit()
    {
        this.movieService.getMovies()
            .subscribe(movies =>
            {
                this.movies = movies;
                this.mov = this.movies[1];
            });
    }
}
从'@angular/core'导入{Component,OnInit};
从'@angular/Http'导入{Http,Response};
从“rxjs/Observable”导入{Observable};
从“/Movie”导入{Movie};
从“/MovieService”导入{MovieService};
导入“rxjs/add/operator/map”;
@组成部分
({
选择器:“我的应用程序”,
模板:`
{{mov.Rating}

    {{movie.Title}-{{movie.Rating}
`, 提供者:[电影服务] }) 导出类AppComponent实现OnInit { 公共名称:字符串; 公共电影:电影;//={标题:“bla”,评级:3}; 公共电影:电影[]; 构造函数(私有movieService:movieService){} 公共ngOnInit() { this.movieService.getMovies() .订阅(电影=> { 这部电影=电影; this.mov=this.movies[1]; }); } }
如果我初始化
mov
变量(并且没有其他更改),它将正常工作

当它失败时,浏览器(chrome、firefox或IE)抛出一个异常(“TypeError:无法读取未定义的属性“Rating”)并结束执行。
MovieService
执行一个实际的API调用,该调用需要几毫秒的时间,在此期间
mov
实际上是未定义的。 在Angular1中,这不是一个问题;它将什么也不显示

我试着在
构造函数中调用
movieService
,但没有什么不同


这是一个预期的行为,一个bug还是我遗漏了什么并且有办法防止它(除了初始化
mov
变量)?

这是预期的行为。正如您已经注意到的,
mov
变量在组件初始化时确实是未定义的。因此,Angular无法读取
mov
额定值
属性。仅当API调用返回时,
mov
变量才被填充

您确实可以在构造函数中初始化变量。另一种可能更简洁的方法是在模板中使用Elvis运算符:

 <p>{{mov?.Rating}}</p>
{{mov?.Rating}


Elvis运算符可防止空值(/未初始化)出现

这是预期的行为。正如您已经注意到的,
mov
变量在组件初始化时确实是未定义的。因此,Angular无法读取
mov
额定值
属性。仅当API调用返回时,
mov
变量才被填充

您确实可以在构造函数中初始化变量。另一种可能更简洁的方法是在模板中使用Elvis运算符:

 <p>{{mov?.Rating}}</p>
{{mov?.Rating}

Elvis运算符可防止空值(/未初始化)出现