我一直在关注Angular 2开发指南。我碰到这个问题,一边做9 Routing and Navigation Milestone 3Angularjs 2组件属性undefined
我添加了一个函数getCrisis
,需要一个参数sn
。该函数异步返回Promise<Crisis>
。
crisis.service.ts
import {Injectable} from 'angular2/core';
import {CRISES} from './mock-crisises';
@Injectable()
export class CrisisService {
getCrisises() {
return Promise.resolve(CRISES);
}
// the | string token is a Pipe
getCrisis(sn: number | string) {
return Promise.resolve(CRISES).then(cries => cries.filter(c => c.serialNumber === +sn)[0]);
}
}
危机form.component.ts调用getCrisis
上ngOnInit
export class CrisisFormComponent implements OnInit, CanDeactivate{
public model: Crisis;
public origin: Crisis;
submitted = false;
active = true;
constructor(
private _service: CrisisService,
private _dialog: DialogService,
private _router: Router,
private _routeParams: RouteParams
) { }
ngOnInit() {
let sn = +this._routeParams.get('sn');
this._service.getCrisis(sn).then(crisis => {
if (crisis) {
console.log(crisis) // debug output
this.origin = new Crisis(crisis);
this.model = crisis;
}
else {
this.gotoCrisisCenter();
}
});
}
危机form.component.html
<h1>Crisis Form</h1>
<form *ngIf="active" (ngSubmit)="onSubmit()" #crisisForm="ngForm">
{{diagnostic}}
<div class="form-group">
<label for="name">Name</label>
<input type="text" class="form-control" required [(ngModel)]="model.name" ngControl="name" #name="ngForm">
<div [hidden]="name.valid || name.pristine" class="alert alert-danger">
Name is required
</div>
</div>
<button type="submit" class="btn btn-default" [disabled]="!crisisForm.form.valid">Submit</button>
</form>
加载crisis-form component
时我得到了这个异常。 input
元素绑定到this.model.name
。由于某种原因,框架似乎发现this.model
为undefined
。我在ngOnInit
函数中添加了一些控制台调试输出。在异常消息后它们出现在控制台的按钮中。 Promise确实得到了正确解决,crisis
对象正确地分配给this.model属性。
但是,框架发现this.model未定义,并且这些消息的顺序出现在控制台中。有可能当框架评估绑定时,由于异步过程,this.model还没有被分配,这会导致异常?然后,Promise
解析并分配给this.model
,并将调试消息打印到控制台。
Angular的live sample做同样的事情,但他们没有得到例外。请参阅app/crisis-centre/crisis-detail.component.ts
第37-46行的示例。
任何帮助将不胜感激。谢谢。
感谢您的回答。我错过了示例html模板中的'* ngIf'指令。 –