Angular2 ngOnchanges没有显示高度变化与可观察
问题描述:
我有一个div,改变高度,当我按下“隐藏”按钮。Angular2 ngOnchanges没有显示高度变化与可观察
我已经通过服务(如cookbook)捕获了这个高度变化,当我按下“获取高度”按钮时,我获得了正确的值更改。
但我想看看我是否可以在不按下按钮的情况下获得高度值。这意味着我正试图实现一个ngOnChanges钩子以查看高度何时发生变化,然后在新控制台发生更改时将新高度记录到控制台。
但我没有得到我的ngOnChanges钩子的回应,尽管我已经看过每一个问题,并试图实现它一样。
我的组件
import { Component, SimpleChanges } from '@angular/core';
import { Subscription } from 'rxjs/Subscription';
import { MissionService } from '../../main2/mission.service';
@Component({
selector: 'test-child3',
templateUrl: './child3.component.html',
styleUrls: ['./child3.component.css']
})
export class Child3Component {
private switch1 = false;
height: number;
subscription: Subscription;
constructor(private missionService: MissionService) {
this.subscription = missionService.missionHeight$.subscribe(
missionData => {
this.height = missionData;
console.log("constructor height = " + this.height)
})
}
ngOnChanges(changes: SimpleChanges) {
if (changes['height'].currentValue) {
console.log("ngOnChanges height = " + this.height);
}
}
heightF() {
this.height = document.getElementById('mainDiv').offsetHeight;
this.missionService.announceHeight(this.height);
console.log("heightF() height = " + this.height);
}
onSwitch1() {
this.switch1 = !this.switch1;
}
我的HTML
<div id="mainDiv">
<button id="hide" (click)="onSwitch1()">Hide</button>
<button (click)="heightF()">Get Height</button>
<div *ngIf="switch1" id="childDiv">
</div>
</div>
这是检测控制台响应每次都遇到我隐藏/取消隐藏内部DIV时间,然后按 “获得高度”按钮,所以我知道我的观察者正在工作并改变高度。
constructor height = 21
heightF() height = 21
constructor height = 198
heightF() height = 198
答
响应当角(重新)设置数据绑定输入属性。方法 接收当前和前一个属性 值的SimpleChanges对象。
在ngOnInit之前调用并且每当一个或多个数据绑定输入 属性发生更改时。
你的高度属性不是输入,你应该@input()属性以及您ngOnChange方法将被输入从父组件检测到您绑定数据的变化。
f.e.
简单parent.component.ts
@Component({
moduleId: module.id,
selector: 'simple-parent',
template: `
<simple-child [someInput]="someValue"></simple-child>
`
})
export class SimpleParentComponent implements OnInit {
someValue: string;
constructor() { }
ngOnInit() { }
}
简单child.component.ts
@Component({
moduleId: module.id,
selector: 'simple-child',
template: 'simple-child.component.html'
})
export class SimpleChildComponent implements OnInit, OnChanges {
@Input() someInput: string;
constructor() { }
ngOnInit() { }
ngOnChanges(changes:{[propName: string]: SimpleChange}): any {
if(changes['someInput'] && this.someInput) {
console.log('someInput change detect');
}
}
这是否意味着你只能对来自数据使用ngOnChanges一个父组件?我没有把'@Input()'放在我的height属性前面,但它没有任何区别。 –
只能对通过输入传递的数据进行ngOnChanges转换。只是添加注释将无济于事。我编辑了我的答案,以显示您正确使用输入为 –
的ngOnChange。最后,我只是将可观察数据发送给父代,并从父代传递给触发ngOnChanges的子代,如同我在代码中那样在一开始的时候。所以,由于你提醒我关于ngOnChanges只处理输入的事实,它间接地回答了我的问题,所以我将其标记为正确。谢谢分配。 –