HTTP请求后NgOnChanges未触发

时间:2017-04-21 13:30:55

标签: javascript angular ngonchanges

我遇到了ngonchanges没有触发的问题。

我有这个组件:

@Component({
    selector: 'conversation-detail',
    templateUrl: './conversation-detail.component.html'
})
export class ConversationDetailComponent implements OnChanges{
    @Input()
    selectedConversation: Conversation;

    title = 'Conversation Detail';    
    convoMessages: Array<Message> = [];


    constructor(
            private _messageService: MessageService
    ){};

    ngOnChanges(changes: SimpleChanges){        
        this.getMessages();
    }

    ngOnInit(): void{

    } 

    private getMessages(){
        if(this.selectedConversation != undefined){
            this._messageService.getMessagesForConversation(this.selectedConversation.ConversationId).then(
                data => {
                    if (data) {
                        this.convoMessages = data.serviceResult as Array<Message>;
                    } else {
                        //This really should never happen
                        console.error('Error retrieving users data: Data object is empty');
                    }
                },
                error => {
                    //loader.dismiss();
                    console.error('Error retrieving users data');
                    console.dir(error);
                }
            );
        }
    }    

}

ngonchanges将在第一次selectedConversation更改时触发。调用GetMessages并将其加载到消息数据中。之后,当selectedConversation改变时,ngonchanges不再触发。

如果我注释掉对getMessages的函数调用,那么每次selectedConversation改变时都会触发ngonchanges。

所以,我不确定getMessages中发生了什么事情,这会阻止ngonchanges的启动。请求返回数据,呼叫结束。有人有什么想法吗?

2 个答案:

答案 0 :(得分:0)

ngOnChanges仅在@Input更改reference时触发,例如输入类型stringbooleannumber,不可变对象。

假设[selectedConversation]绑定到数组arrSelected,如果您执行arrSelected.push之类的操作,则数组不会更改ref,因此ngOnChanges不会被激活。< / p>

因此您需要使用不可变数组,使用concatslice等来更改数组引用

答案 1 :(得分:0)

请将您的组件更改为:

@Component({
    selector: 'conversation-detail',
    templateUrl: './conversation-detail.component.html',
    changeDetection: ChangeDetectionStrategy.Default
})

这对我来说很好。