Переписать проект javascript в Angular

#javascript #angular

#javascript #angular

Вопрос:

Я новичок в веб-разработке и подумал об изучении Angular, создав простой проект javascript на Angular. Это проект udemy, разработанный на javascript с использованием шаблона MVC введите описание изображения здесь

Здесь проект разделен на 3 части :

Поиск по списку покупок рецептов

как только пользователь введет некоторый текст в строку поиска и нажмет поиск, данные будут заполнены в левой части, как показано на рисунке.

Я создал два компонента в Angular, один из которых — SearchComponent, а другой — result component. Я сохранил поиск в заголовке и компоненте результата в теле.Я создал один класс сервиса с именем Recipe для получения данных из API с использованием HttpClient.

Я вызываю API, когда нажимаю кнопку поиска и сохраняю данные в переменной Recipes, но как передать эти данные в resultcomponent.

У меня есть основные сомнения, правильно ли создавать два компонента, когда мы не перенаправляем на другую страницу?

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

Спасибо и с уважением,

Нагасри.

Комментарии:

1. Сохраните результат поиска как наблюдаемый и подпишитесь на него в компоненте результата, тогда вы будете получать данные при каждом изменении наблюдаемого значения. Наблюдаемая концепция RxJS

2. Привет, Дерек, правильный ли подход к созданию компонентов для разделов страницы?

3. Да, теперь он в основном разделен на две части (заголовок и тело), и они связаны с сервисом. Это обычная угловая структура. И один из наиболее важных — это наблюдаемый на angular, и с помощью angular вы можете синхронизировать данные с api. Эта ссылка поможет вам. angular.io/guide/observables-in-angular

Ответ №1:

Сохраните ваши результаты внутри сервиса как наблюдаемый:

 export class RecipeService{
    results$: Observable<Result[]>;

    constructor(private http: HttpClient) {}

    search(value:string){
         this.results$ = this.http.get<Result[]>(...value...);
    }
}
  

Вызовите службу из вашего поискового компонента, чтобы заполнить наблюдаемые результаты:

 export class SearchComponent {
    constructor(private recipeService: RecipeService) {}

    // call from button in template
    search(value:string){
        this.recipeService.search(value);
     }
}
  

Получите доступ к результатам, наблюдаемым из вашего компонента результатов, и используйте асинхронный канал для обработки подписки / отмены подписки:

 @Component({
  selector: 'app-results',
  template: '<li *ngFor=“let result of recipeService.results$ | async”>{{ result.name }} </li>'
})
export class ResultsComponent {
    constructor(private recipeService: RecipeService) {}
}
  

Stackblitz, показанный выше: https://stackblitz.com/edit/so-recipes?file=src/app/results.component.ts

Глядя на скриншот, я бы использовал как минимум 3 компонента:

  • панель поиска
  • Результаты
  • выбранный рецепт

Комментарии:

1. Не удается найти другой поддерживающий объект ‘[object Object]’ типа ‘object’. ngFor поддерживает привязку только к итерациям, таким как массивы. Я получаю эту ошибку, как только я изменил код, как вы указали. Я искал в Google, они сказали использовать async, но я уже использую async, как вы упомянули

2. Должен работать как recipe $ — это наблюдаемый массив, который преобразуется в массив через асинхронный канал. Попробуйте временно поместить ‘this.result $.subscribe (console.log);’ в тело конструктора службы и посмотреть, регистрирует ли он список.

3. Также попробуйте использовать обновленную строку кода для инициализации recipe $ в сервисе.

4. Я проверил с помощью console.log(), что он получает данные, но даже после инициализации также получает ту же ошибку.

5. Очень вероятно, что ваш http-сервис не возвращает данные в правильном формате списка / массива. Вот рабочий stackblitz, основанный на приведенных выше советах, но он использует of operator для возврата массива рецептов, а не для вызова http-службы (которой у меня нет): stackblitz.com/edit /…