Angular 2 - 当 *ngFor 完成对父组件的调用函数时
Angular 2 - when *ngFor completes call function on parent component
我正在尝试为我的 Angular 2 应用程序创建轮播组件。
我希望轮播是通用的,以便它支持这两种情况:
<myCarousel>
<div>first card</div>
<div>second card</div>
....
</myCarousel>
和更通用的
<myCarousel>
<myCard *ngFor="let card of cards" [card]="card"></myCard>
</myCarousel>
问题是轮播组件需要在 *ngFor 完成后运行 初始化,否则将无法正确显示。
由于数据来自网络服务调用,我无法猜测确切的时间,但我需要 carousel 组件以隐式或显式方式观察 *ngFor 何时完成。有人可以帮忙吗?谢谢!
ngFor
的最后一次尝试触发事件如下
<myCard *ngFor="#card in cards; #last=last" [card]="card" [attr.ready]="last ? false : true"></myCard>
并在代码中执行此操作
@Input()
set ready(isReady: boolean) {
if (isReady) someCallbackMethod();
}
希望这对您有所帮助:)
你可以使用 ContentChildren
.
@ContentChildren(MyCardComponent) cards: QueryList<MyCardComponent>;
ngOnAfterContentInit() {
this.cards
.changes
//.debounce(100) /* maybe add an additional debounce time.. */
.subscribe(cards => {
// received new cards..
});
}
还有另一个 Whosebug 答案已经解决了这个问题:
我的解决方案非常相似:一个指令(称为 CarouselItem)应用于 *ngFor 内的旋转木马元素,定义一个布尔输入,告诉元素是否是最后一个,以及一个 属性(或 eventemitter ) 可以设置为在到达最后一个元素时调用的函数。
因此模板变为:
<myCarousel #carousel>
<myCard *ngFor="let card of cards; let l = last"
[card]="card"
CarouselItem
[ready]="l ? true : false"
[init]="carousel.initialize">
</myCard>
</myCarousel>
需要变量 #carousel 才能从 myCard 指令 ( [init]="carousel.initialize" ) 中引用轮播组件。
指令代码如下:
@Directive({
selector: `[CarouselItem]`
})
export class CarouselItem {
@Input('init') onInit: Function = () => {};
@Input() set ready(isReady: boolean) {
if (isReady)
setTimeout(()=>this.onInit(), 200);
};
}
最后轮播组件包含一个public初始化方法。
public initialize= ()=> {
// perform initialisation
};
我正在尝试为我的 Angular 2 应用程序创建轮播组件。
我希望轮播是通用的,以便它支持这两种情况:
<myCarousel>
<div>first card</div>
<div>second card</div>
....
</myCarousel>
和更通用的
<myCarousel>
<myCard *ngFor="let card of cards" [card]="card"></myCard>
</myCarousel>
问题是轮播组件需要在 *ngFor 完成后运行 初始化,否则将无法正确显示。
由于数据来自网络服务调用,我无法猜测确切的时间,但我需要 carousel 组件以隐式或显式方式观察 *ngFor 何时完成。有人可以帮忙吗?谢谢!
ngFor
的最后一次尝试触发事件如下
<myCard *ngFor="#card in cards; #last=last" [card]="card" [attr.ready]="last ? false : true"></myCard>
并在代码中执行此操作
@Input()
set ready(isReady: boolean) {
if (isReady) someCallbackMethod();
}
希望这对您有所帮助:)
你可以使用 ContentChildren
.
@ContentChildren(MyCardComponent) cards: QueryList<MyCardComponent>;
ngOnAfterContentInit() {
this.cards
.changes
//.debounce(100) /* maybe add an additional debounce time.. */
.subscribe(cards => {
// received new cards..
});
}
还有另一个 Whosebug 答案已经解决了这个问题:
我的解决方案非常相似:一个指令(称为 CarouselItem)应用于 *ngFor 内的旋转木马元素,定义一个布尔输入,告诉元素是否是最后一个,以及一个 属性(或 eventemitter ) 可以设置为在到达最后一个元素时调用的函数。
因此模板变为:
<myCarousel #carousel>
<myCard *ngFor="let card of cards; let l = last"
[card]="card"
CarouselItem
[ready]="l ? true : false"
[init]="carousel.initialize">
</myCard>
</myCarousel>
需要变量 #carousel 才能从 myCard 指令 ( [init]="carousel.initialize" ) 中引用轮播组件。
指令代码如下:
@Directive({
selector: `[CarouselItem]`
})
export class CarouselItem {
@Input('init') onInit: Function = () => {};
@Input() set ready(isReady: boolean) {
if (isReady)
setTimeout(()=>this.onInit(), 200);
};
}
最后轮播组件包含一个public初始化方法。
public initialize= ()=> {
// perform initialisation
};