Вы упомянули, что state
было из поля ввода, что означает (предполагая, что FormsModule
импортируется, что следует учитывать ngModel
), мы можем получить это значение в качестве наблюдаемого.
Вы можете использовать switchMap
, чтобы подписаться на одну Наблюдаемую, сопоставить ее выбросы со второй Наблюдаемой и получать результирующие значения излучения Наблюдаемой от второй Наблюдаемой, пока первая Наблюдаемая не испустит снова (вы переключаетесь на новую Наблюдаемую).
Вы можете получить Observable изменений значений из своего элемента управления формы несколькими различными способами в зависимости от того, как настроена форма, или даже просто с помощью привязки (keyup)
.Не указав ngForm
в шаблоне, прикрепленном к элементу управления, вы можете просто запросить ngModel
через привязку шаблона:
<input type="text" [(ngModel)]="state" #value="ngModel"/>
, а затем в своем компоненте:
class Component {
@ViewChild('value') value: NgModel;
//filled with a http call to a webservice
private subject = new BehaviorSubject([])
public state = 'Open'; // This remains as a component property, but we don't need it for the Observable stream as we'll get the value changes Observable from the form control.
public workOrders = this.subject.asObservable().pipe(
switchMap(this.value.valueChanges),
withLatestFrom(this.subject),
map([inputValue, orders] => {
return orders.filter(f => f.State === inputValue.value)
}));
}
Вы также можете отдельно управлять подпиской как по вызову http, так и по изменению входного значения, но это неинтересно.
Однако ...
Как видите, вышесказанное становится немного сложнее;нам нужно withLatestFrom
, чтобы сохранить значение HTTP-вызова, который, как я предполагаю, является статическим после получения.Так как вы используете канал async
в разметке для подписки и вызова Observable, возможно, лучше выбрать дизайн, просто отфильтровав результат с другим каналом!
@Pipe({name: 'filterState'})
export class FilterStatePipe implements PipeTransform {
transform(value: YourTypeHere[], state: string) {
return value.filter(s => s.State === state);
}
}
Затем объявите его в своем модуле и используйте в разметке следующим образом:
<input type="text" [(ngModel)]="state" />
<tr *ngFor="let order of workOrders$ | async | filterState:state">
async
развернет Observable для вас, тогда ваш пользовательский канал отфильтруетзначение основано на значении state
.Когда state
изменяется, труба должна быть перезапущена.