Nano Hash - криптовалюты, майнинг, программирование

Объекты, заданные методом фильтра (для поля автозаполнения material.angular.io), становятся неопределенными.

Я попытался реализовать функцию автозаполнения angular.material.io. Однако при попытке закодировать его в моем коде я столкнулся с ошибкой наличия неопределенных параметров. Я не знаю, почему именно так.

Это мой реализованный машинописный код.

export class BooksComponent implements OnInit {
  private books: Array<Book> = [];
  //Autofillers & form controllers
  private bookCtrl = new FormControl();
  private filteredBooks: Observable<Book[]>;

  constructor() { 
    //Replace this in the future with data passed from the API
    JSONBooks.forEach(book =>
        this.books.push(new Audiobook(book.title, book.description, book.ISBN, book.image, book.price, book.amazonLink,
          book.publisher, book.amountOfChapters, book.soldCopies, book.adaptedForScreens, book.dateAdded, book.rating, book.amountOfHours))
      );
    //Formcontrol and autofills
    if (this.books) {
      this.filteredBooks = this.bookCtrl.valueChanges
      .pipe(
        startWith(''),
        map(book => book ? this.filterBooks(book) : this.books.slice())
      );
    }
    }

    ngOnInit() {}

    private filterBooks(value: Book): Book[] {
      return this.books.filter(
        //Matches book title
        book => book.getTitle.toLowerCase().indexOf(value.getTitle.toLowerCase()) === 0
        );
    }
}

Это мой реализованный HTML-код.

Я хотел бы найти книгу с названием

    </p>
      <form>
        <mat-form-field>
          <input matInput placeholder="Title" aria-label="Title" [matAutocomplete]="auto" [formControl]="bookCtrl">
          <mat-autocomplete #auto="matAutocomplete">
            <mat-option *ngFor="let book of filteredBooks | async" [value]="book.getTitle">
              <span>{{book.getTitle}}</span>
            </mat-option>
          </mat-autocomplete>
        </mat-form-field>
      </form>
    <p>

Вывод консоли, строка 118 относится к моему машинописному коду, этот раздел: .indexOf(value.getTitle.toLowerCase())

core.js:15723 ERROR TypeError: Cannot read property 'toLowerCase' of undefined
    at books.component.ts:118
    at Array.filter (<anonymous>)
    at BooksComponent.push../src/app/books/books.component.ts.BooksComponent.filterBooks (books.component.ts:116)
    at MapSubscriber.project (books.component.ts:62)
    at MapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/map.js.MapSubscriber._next (map.js:35)
    at MapSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54)
    at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber.notifyNext (mergeMap.js:84)
    at InnerSubscriber.push../node_modules/rxjs/_esm5/internal/InnerSubscriber.js.InnerSubscriber._next (InnerSubscriber.js:15)
    at InnerSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54)
    at SafeSubscriber.schedulerFn [as _next] (core.js:13514)

Я проверял несколько раз, но не могу найти проблему в своем коде.

ПРИМЕЧАНИЕ. this.books заполняется, и свойства можно прочитать. Такие методы, как book.getTitle и т. д., также работают. Почему-то объект не передается методу filterBooks.


Ответы:


1

Добавьте простое условие if, чтобы проверить, что value не равно нулю

 this.books.filter(
        //Matches book title
        book => {
             if(!value.getTitle) return false
             return book.getTitle.toLowerCase().indexOf(value.getTitle.toLowerCase()) === 0
        } );
06.05.2019
  • Я мог бы сделать это, и я не получу сообщение об ошибке, но функция также не будет работать. Я хочу, чтобы функция работала и автозаполнялась, как показано в примере по приведенной выше ссылке. Спасибо за ответ! 06.05.2019

  • 2

    В вашем коде конструктора вы используете this.bookCtrl.valueChanges.pipe(). Функция pipe() возвращает Observable. поэтому вам нужно подписаться на этот наблюдаемый объект и присвоить ему переменную this.filteredBooks.

    this.bookCtrl.valueChanges
          .pipe(
            startWith(''),
            map(book => book ? this.filterBooks(book) : this.books.slice())
          )
          .subscribe((books) => this.filteredBooks = books);
    

    Обратитесь к документации по Observables: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html

    06.05.2019
  • Я скопировал ваш код, но это не сработало, выдало другую ошибку. Я также не понимаю, зачем мне это добавлять, если этого нет в примере? Я что-то упускаю? Это дало следующую ошибку: ```Тип 'Book[]' не может быть назначен типу 'Observable‹Book[]›'.ts(2322) В типе 'Book[]' отсутствуют следующие свойства из типа 'Observable‹Book []›': _isScalar, источник, оператор, подъем и еще 5.ts(2740) ``` 06.05.2019
  • Вы должны подписаться на Observable, а затем присвоить результат переменной. Я добавил ссылку на документацию Observable для справки. 07.05.2019
  • Я попробовал, но, похоже, это не сработало, как я ожидал. Я добавил ваш код. Только пришлось изменить тип моей filteredBooks на Book[] вместо Observable‹Book[]›, но это не работает. Выдает другую ошибку. BooksComponent.html:61 ОШИБКА TypeError: Не удается прочитать свойство 'dispose' со значением null в AsyncPipe.push../node_modules/@angular/common/fesm5/common.js.AsyncPipe._dispose (common.js:4753) в AsyncPipe.push ../node_modules/@angular/common/fesm5/common.js.AsyncPipe.transform (common.js:4728). Я также пытался просмотреть несколько видеороликов об наблюдаемых, но безуспешно:/ 13.05.2019

  • 3

    this.bookCtrl — это элемент управления для текстового поля. Таким образом, this.bookCtrl.valueChanges выводит текст в текстовое поле.

    Я считаю, что следующий код решит проблему.

    // Formcontrol and autofills
    if (this.books) {
      this.filteredBooks = this.bookCtrl.valueChanges
        .pipe(
          startWith(''),
          map(bookName => bookName ? this.filterBooks(bookName) : this.books.slice())
        );
    }
    

    И функция filterBooks:

      private filterBooks(bookName: string): Test[] {
        return this.books.filter(
          // Matches book title
          book => book.getTitle.toLowerCase().indexOf(bookName.toLowerCase()) === 0);
      }
    

    Кроме того, поскольку в шаблоне html используются bookCtrl и filteredBooks, рекомендуется изменить модификаторы доступа на общедоступные. Для получения дополнительной информации об этом: частный и общедоступный в компоненте Angular

    07.05.2019
  • Ваш код не решает проблему полностью. Тем не менее, это также не дает никаких ошибок. Я отладил код (на самом деле я просто использовал console.logs), и функция фильтра работает нормально и все такое. Однако он не показывает предложения автозаполнения в HTML. Возможно, как сказал Четан, мне следует добавить обсервальбе, что для меня имеет смысл, но это не работает так, как я ожидал. 13.05.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..