2016-08-23 106 views
1

我正在處理和過濾日誌的角管道。angular2管道和新數據

我管看起來像這樣

import {Injectable, Pipe,PipeTransform} from '@angular/core'; 

@Pipe({ 
name: 'logFilter' 
}) 
@Injectable() 
export class logFilterPipe implements PipeTransform { 
    transform(items: any[], args: any[]): any { 
    //console.log(items); 

    if (!args || args.length == 0) 
    { 
     return items; 
    } 

    return items.filter(item => item.msg.indexOf(args[0]) !== -1); 

} 
} 

HTML部分

<input type="text" [(ngModel)]="filterLog" class="validate" /> 

<ul id="messages"> 
    <li *ngFor="let msg of messages | logFilter:filterLog"> <div class="chip">{{ msg.user }}</div> {{ msg.msg }}</li> 
</ul> 

新的消息可以被添加拋出socket.io輸入

this.socket.on( '消息',功能(消息,用戶) {this.messages.push({user:user,msg:message});

}

如果我在輸入文本中輸入,但如果在那之後又添加了新消息,並且沒有顯示(例如過濾),那麼過濾器可以正常工作,我猜有些東西要觸發過濾更新?

回答

1

角變化檢測沒有檢測到陣列內的變化,只有陣列實例的變化(通過一個不同的陣列實例)

使管不純

@Pipe({ 
name: 'logFilter', 
pure: false 
}) 

使得Angular2執行管每次變化檢測對使用管道的組件執行。

或者,您也可以在每次修改後使用this arr = this.arr.splice()來創建數組的不同副本,以便通過Angular通知更改。

它取決於用例和數組大小哪種方法更有效。