Angular 2 how to make child component wait for async data to be ready

后端 未结 3 1188
遇见更好的自我
遇见更好的自我 2020-12-07 12:53

I\'m passing async data from a parent component to a child component. And the child component needs to know the length of the data in order to do something.

How the

相关标签:
3条回答
  • 2020-12-07 13:06

    Simpler solution:

    ngOnChanges(changes: SimpleChanges) {
        if (changes['items'].currentValue) {
            this.items = items
        }
    }
    
    0 讨论(0)
  • 2020-12-07 13:12

    There are three ways to do this:

    1. Put an *ngIf in parent. Only render child when parent's items is ready.
    <div *ngIf="items">
       <child [items]="items | async">
    </div>
    
    1. Separate your input getter setter in child. Then act whenever the value is set, you can use RxJS BehaviorSubject also.
    private _items = new BehaviorSubject<Items[]>([]);
    
    @Input() set items(value: Items[]) { 
        this._items.next(value); 
    }
    
    get items() {
       return this._items.getValue();
    }
    
    ngOnInit() {
        this._items.subscribe(x => {
           this.chunk(x);
        })
    }
    
    1. Do it during the ngOnChanges of the child. Refer to here for example. https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#onchanges
    0 讨论(0)
  • 2020-12-07 13:33

    You can use a setter :

    export class child implements OnInit{
        itemChunks: Items[][];
    
        private _items ;
    
        //bellow  will get called when ever the items are passed in by the parent component
        @Input( 'items' ) set items ( items: Items[] ) {
           this._items = items;
    
           this.itemChunks = this.chunk(this._items);
        }
    
    
    
    
        chunk(items: Items[]) {
            let result = [];
            for (var i = 0, len = items.length; i < len; i += 6) { // this line causes the problem since 'items' is undefined
                result.push(items.slice(i, i + 6));
            }
            return result;
        }
    }
    



    Any by the way, I feel like your parent component is not right as well, it should be :

    @Component({
        moduleId: module.id,
        selector: 'parent',
        template: `<div>
                        <child [items]="items | async">
                    </div>`
    })
    
    export class Parent implements OnInit {
    
        items: Items[];
    
        constructor(
            private itemService: ItemService,
            private router: Router
        ) { 
             this.items = this.itemService.getItemss(); // if getItemss is returning an observable, which I think it does
         }    
    
    }
    
    0 讨论(0)
提交回复
热议问题