【发布时间】:2017-05-02 12:25:05
【问题描述】:
我正在开发一个Angular2 应用程序,其中一个@Components 有一个按钮,单击该按钮将向我的服务器发送post 请求,该请求将以Ok(string) 或BadRequest(string) 响应。
从服务器获得答案后,我无法更新我的 @Component 之一的 @Input 字段。
以下是我的一些课程的简化版本。
我的组件类
@Component({
moduleId: module.id,
selector: 'model-comp',
templateUrl: './model.component.html',
styleUrls: ['./model.component.css']
})
export class MyComponent{
@Input() model: Model;
@Output() emitter: EventEmitter<Model> = new EventEmitter<Model>();
public constructor(private service: MyService){}
public toggle(): void {
this.service.send(model.id, model.name){
.subscribe(
result => this.onSuccess(result)),
error => this.onError(error),
() => this.onComplete());
}
public onSuccess(result: string): void {
if(result.inculdes("Some Text")) this.model.flag = true;
else this.model.flag = false;
this.emitter.emit(this.model);
}
public onError(error: any): void {
//notification using bootstrap-notify
}
public onComplete(): void {
//currently empty
}
}
我的服务类
export class MyService{
public send(id: string, name: string){
return <Observable<string>>this.http
.post('url', new Dto(id, name))
.map(result => this.getData<string>(result))
.catch(this.catchBadResponse);
}
private getData<E>(result: Response): E {
//checking if result.status is ok
var body = result.json ? res.json(): null;
return <E>(body || {});
}
private catchBadRespomse: (error: any) => Observable<any> = (error: any) => {
var response = <Response>error;
var json = response.json();
var msg = json.Message;
var errormsg = json?
(json.error ? json.error: JSON.stringify(msg?msg:json)) :
(response.statusText || 'Error?');
return Obserable.of(errormsg);
}
}
MyComponent 的模板
<button (click)="toggle()"
[ngClass]="{'class1': true, 'class2': model.flag}">Text</button>
父组件模板
<div *ngFor="let model of getList()">
<model-comp [model]="model" (emitter)="onEmit($event)"></model-comp>
</div>
onEmit 函数
onEmit(evt: any): void{
if(evt instanceof Model){
var evtModel = evt as Model;
this.list.find(search => search.id == evtModel.id)
.isFav = evtModel.isFav;
}
}
问题是,即使我发布了我的数据并收到了响应,我的model 的属性flag 并没有改变。
我认为点击事件会重新加载组件,从而移除EventEmitter 的观察者。
那么有没有什么办法可以取消重载,不丢失EventEmitter的观察者或者任何其他方式来更新根对象或者元素类呢?
【问题讨论】:
-
如果你有一个输入和输出,你应该把它命名为
@Input() model:Model;和@Output() modelChange:EventEmitter<Model> = ...,然后你可以使用“双向”绑定,比如[(model)]="someProp" -
@GünterZöchbauer 我如何命名输出字段重要吗?
-
名称总是很重要 ;-) 如果它是关于相同的属性,那么它们应该根据我提到的模式来命名。只是一个提示 - 与您的实际问题无关。
-
为什么订阅会重新加载组件?我认为情况并非如此。为什么你认为
model.flag没有改变——因为class2没有添加? -
您可以尝试添加一个类似
<button (click)="model.flag = !model.flag">click me</button>的按钮并检查这是否会导致预期的行为?
标签: javascript angular typescript input observable