#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 /…