【发布时间】:2016-11-21 09:34:07
【问题描述】:
以下是我的父(常规)组件,它从服务器加载数据并将其绑定到子(订单)组件
import { Component, OnInit ,Output,EventEmitter} from '@angular/core';
import { REST,Response } from '../../../services/rest/rest.service';
import {Observable} from 'rxjs/Observable';
@Component({
selector: 'general',
template: '<div>
<div class="order">
<order [order]="orderData"></order>
</div>
</div>',
styleUrls: ['./general.component.css']
})
export class GeneralComponent {
public orderData: Order = null;
public static projectDataUrl: string = 'orderViewOrder';
constructor(private rest: REST) {
this.loadOrderData();
}
}
private loadOrderData(): any {
this.rest.getWithStringId(GeneralComponent.projectDataUrl, '123').map(
(res: Response) => res.json()).
catch((error:any)=>Observable.throw(error.json()||'Server error')).
subscribe(data => {
console.log(data);
this.orderData =<Order>data // here data is set
this.notifyOthers.emit(this.orderData)},
err => console.log("Error should get printed \n"+err),
() => console.log("It should be executed in the end"));
}
}
export class Order {
communicatedFinishedDate:number[];
customerId:number;
estimatedSampleArrival:number[];
finishDate:number[];
id:string;
name:string;
oldId:string;
orderNumber:string;
quoteNumber: string;
samplesStoredUntil:any;
startDate:number[];
type:string;
}
}
在子组件中
**OrderComponent**
import { Component, OnInit ,Input} from '@angular/core';
import {Order} from '../../container/general/general.component';
@Component({
selector: 'order',
template: '<div>
<div class="order">
<h2 class="label">Order details</h2><br>
<label>Type</label><br>
<span>{{orderData.type}}</span><br>
<label>Services/Characteristics</label><br>
<span>{{orderData.finishDate}}</span><br>
<label>Quote/Offer No</label><br>
<span>{{orderData.quoteNumber}}</span><br>
<label>Order/Purchase No</label><br>
<span>{{orderData.orderNumber}}</span><br>
</div>
</div>',
styleUrls: ['./order.component.css']
})
export class OrderComponent {
@Input('order') public orderData: Order;
constructor() {
}
}
问题:父组件成功加载数据,但在订单组件中为空。
当我调试时,我可以在 this.orderData 中看到数据。
据我了解,订阅者就像“异步方法” OrderComponent 甚至在设置之前使用 orderData 订阅者
(如果我错了,请纠正我)
那么解决办法是什么?我阅读了有关事件发射器的信息并尝试在通用组件中做这样的事情:
@Output() notifyOthers: EventEmitter = new EventEmitter();
在订阅者中:
...
subscribe(data => {
console.log(data);
this.orderData =<Order>data
this.notifyOthers.emit(this.orderData)},
...
请帮帮我。
谢谢
UPDATE如何将Not Null 数据绑定到子组件,有没有办法让实例等到我们从订阅者获取数据? p>
我正在像这样检查子组件中的 orderData 实例:
<div class="order">
<h2 class="label">Order details</h2><br>
<label>Type</label><br>
{{orderData===null}} // returns true
{{orderData|json}} // returns nothing
<span>{{orderData?.type}}</span><br> //**With Operator it shows nothing since orderData is null**
<label>Services/Characteristics</label><br>
<span>{{orderData.finishDate}}</span><br>
<label>Quote/Offer No</label><br>
<span>{{orderData.quoteNumber}}</span><br>
<label>Order/Purchase No</label><br>
<span>{{orderData.orderNumber}}</span><br>
</div>
UPDATE2 当我在 OrderComponent 实际处理订阅者函数之前调试控制首先进入。
【问题讨论】:
-
您可以在您的子模板中使用 elvis 运算符吗?再试一次?喜欢
orderData?.type -
@echonax:感谢您的评论。 Elvis 运算符将避免“空异常”,因为“orderData”在订单组件中为空。我试过了,没用。
-
如果我误解了,我很抱歉,但是通过我发布的解决方案,除非
orderData为空,否则将创建您的子组件。 -
@ulubeyn:我想我没有很好地解释问题,我想将“NOT NULL”数据传递给子组件。
-
你能告诉我,当你尝试我的解决方案时会发生什么,调试模式下的输出是什么,调试时你想看到什么?
标签: angular observable