Angular 角度2 rc1组件初始化
我正在试验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
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运算符可防止空值(/未初始化)出现