У меня есть несколько разных труб, которые я бы хотел включить и выключить, если пользователь хочет отфильтровать свои данные по некоторым другим критериям. Как мне активировать/деактивировать трубы, используемые в настоящее время в поиске, или построить один канал, который ведет себя по-разному в зависимости от того, на какие кнопки нажал пользователь?Угловая 2, динамически создайте пользовательскую трубку на основе предпочтений пользователя
Например, две трубы/фильтры будут выглядеть следующим образом ...
//cloud.pipe.ts
import {Pipe} from '@angular/core';
import {Hero} from './hero';
@Pipe({
name: 'Cloud'
})
export class CloudPipe{
transform(value) {
if (value == null) {
return null;
}
return value.filter(hero => {
return hero.cloud === true;
});
}
}
//location.pipe.ts
import {Pipe} from '@angular/core';
import {Hero} from './hero';
import { HeroService } from './hero.service';
import { HeroesComponent } from './heroes.component';
@Pipe({
name: 'Location'
})
export class LocationPipe{
transform(value) {
if (value == null) {
return null;
}
return value.filter(hero => {
return hero.location < 500;
});
}
}
Тогда я хотел бы иметь пользователю переключать различные кнопки фильтра и добавить/удалить трубы к списку. Какой лучший подход для чего-то подобного?
<!--Toggle what pipes should be used in search-->
<!--For example how can I construct the "updatePipe" function for doing this?-->
<button id="activateCloud" (click)="updatePipe()"></button>
<button id="activateLocation" (click)="updatePipe()"></button>
<!--Is it possible to have: neither of the pipes active, both at the same time or just one at the time? How can I do this?-->
<div *ngFor="let hero of heroes | Cloud | Location ></div>
Я бы предпочел не иметь все в одной и той же трубе, поскольку я хотел бы расширить каждую трубу, чтобы делать больше в будущем. Поэтому каждая труба должна «быть ее собственной» и работать независимо друг от друга, но в то же время работать вместе с другими трубами, когда это необходимо.
Спасибо за быстрый ответ, th выглядит многообещающим. Я проверю это позже, если я смогу заставить его работать! –
В вашем примере, LocationPipe - единственный канал, который вы экспортируете? (Почему LocationPipe является оболочкой «самого себя» и cloudPipe?) И в этом случае, что нового LocationPipe(); Ссылаться на? Это подразумевается, что две трубы (LocationPipe, CloudPipe) импортируются из отдельных файлов (как в моем примере) и используются для повторного экспорта нового LocationPipe? Извините, но я не понимаю, что происходит. Также я получаю сообщение об ошибке: Property 'pipes' не существует в типе 'LocationPipe' в моем машинописном компиляторе. Надеюсь, что я не пропущу что-то очевидное, не могли бы вы объяснить немного больше, что происходит в вашем примере? –
Извините, забыли переименовать. Я обновил свой ответ. «LocationPipe» и «CloudPipe» фактически не используются в качестве каналов, а просто вызываются напрямую. Они также могут быть введены с использованием конструктора. –