Как использовать карту и присвоить значение обратно - PullRequest
1 голос
/ 27 марта 2019

У меня есть список книг с IsEnable по умолчанию False.Мне нужно проверить каждую книгу, включена ли она или нет в onInit ().Я думал о добавлении карты rxjs и вызове функции getElptableBooks () внутри карты, но как назначить возвращаемое значение true или false в IsEnable?

Books.ts

export class Book{
Name:string;
IsEnable:boolean;
}

books.component.ts

...
books = Observable.of([{"Name":"A", "IsEnable":"False"},{"Name":"B", "IsEnable":"False"}]);
...
getEligibleBooks(book){
//complex logic
return result; //true or false
}
...
ngOnInit(){
this.books.pipe(
    map( book => this.getEligibleBooks(book)) // have no idea how to achieve it
  ).subscribe(data=>console.log(data));
}

Ответы [ 3 ]

1 голос
/ 27 марта 2019
  • Поскольку вы фактически не меняете возвращаемый тип нигде, нет необходимости использовать map. Кажется, все, что вы хотите сделать, это перебрать возвращенный результат и, возможно, установить член в экземпляре книги. В этом случае используйте tap вместо map. map полезно, если вы хотите преобразовать вход в другой выход.
  • Код должен проводить различие между массивом и объектом при выполнении операции. Это становится легче увидеть, когда вы определяете ожидаемые типы в сигнатурах вашего метода как для входных данных (аргументов метода), так и для возвращаемого типа. То же самое касается именования аргументов, использования формы множественного числа для массивов и формы единственного числа для типов, не являющихся массивами. В этом случае используйте books и book.
  • Я бы рекомендовал использовать интерфейс над классом, поскольку у вас нет определенного поведения. Это проще при отображении разобранного json в тип.
  • Обратите внимание, что постоянные логические значения true и false, не присваивайте "True" / "False", так как это строковые литералы, а не логические значения. Если вы сделаете правдивое сравнение на "False", то получите true

Books.ts

export interface IBook{
    Name:string;
    IsEnable:boolean;
    IsEligible?:boolean|undefined;
}

books.component.ts

books: IBook[];

getBooksAsync() : Observable<IBook[]> {
  return Observable.of([{"Name":"A", "IsEnable":false},{"Name":"B", "IsEnable":false}] as IBook[]);
}

isBookEligible(book: IBook): boolean {
  return true; // hard coded for now because there is no implementation
}

ngOnInit(){
    this.getBooksAsync.pipe(
        tap((books) => {
            books.forEach((book) => book.IsEligible = this.isBookEligible(book));
        })
    ).subscribe(books => this.books = books);
}
0 голосов
/ 27 марта 2019

Rxjs оператора транслирует всю таблицу одновременно. Оператор отображения Rxjs отображает всю таблицу на новый вывод. Если вы хотите изменить элементы в таблице, вам также нужно использовать функцию js map для изменения всей таблицы, проверяя все элементы таблицы отдельно.

this.books.pipe(
      map(
        books => books.map( book => { ...book, IsEnable: this.getEligibleBooks(book) })),
    ).subscribe(data => console.log(data));
0 голосов
/ 27 марта 2019

Вы можете попробовать это

this.books.pipe(
    map( book => {
     book.IsEnable = this.getEligibleBooks(book); 
     return book
    }) 
).subscribe( data => console.log(data) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...