Size: a a a

Angular - русскоговорящее сообщество

2020 May 15

AT

Alexander Trunov in Angular - русскоговорящее сообщество
🇻
Привет, помогите пожалуйста, я нуб в angular
Делаю тестовое задание на позицию js разработчика, нужно сделать на angular + ionic. Вот разбираюсь с ними

У меня есть кнопка на странице, которая вызывает showFilters и отображает ionic popover

import { PopoverController } from 'ionic-angular';
import { Filters } from '../filters/filters';
@Component(...)
export class HotelsPage {
   start: number;
   end: number;
   constructor(private popoverCtrl: PopoverController) {}
   async showFilters(ev: Event) {
       const popover = await this.popoverCtrl.create(Filters);
       return await popover.present({
           ev: ev
       });
   }
}
Filters это обычный компонент
@Component(...)
export class Filters {
   start: number;
   end: number;
   constructor() {}
}

Как мне получить данные (start, end) из class Filters ?
Есть вариант повешать событие на закрытие поповера, но я хочу что бы все взаимодействия были реактивныеми, что бы данные перетекали без закрытия
popover.onDidDismiss(payload => {
   console.log(payload)
});
Не работал с ionic-ом, поэтому только могу предположить. В доке по popover'у (https://ionicframework.com/docs/api/popover), указано, что у инстанса popever есть свойство component, ссылающееся на компонент поповера. Можешь в этом компоненте определить стрим, в который будешь пушить свои события.
источник

BK

Bogdan Khamitov in Angular - русскоговорящее сообщество
Oleg Safonov
стойте,  уже сам запутался
Вот полностью метод . Он отрабатывает нормально . Но мне нужно понять , когда он выполнится полностью. И для этого мне посоветовали использовать forkJoin .Можно ли как то преобразовать данный код в forkJoin . Или как то подписаться , чтобы понять что все данные пришли ?
                                getAllDataFromDb(){  
                                 return this.db.getAllDataFromDb().toPromise().then(dbData => {
                                   console.log('getAllDataFromDb',dbData);
                                   for(let i = 0; i < Object.keys(dbData).length; i++){
                                           this.facebookService.getDataOfAds(dbData[i].token)
                                           .toPromise()
                                           .then(response => {
                                             this.ls.addItem(response,dbData[i]);
                                             this.filter();  
                                           })
                                           .catch((err:any) => {
                                             console.log(err);
                                           });
                                         }
                                       })
                                 //если ошибка
                                 .catch((err:any) => {
                                   console.log(err);
                                 });  
                               }
источник

OS

Oleg Safonov in Angular - русскоговорящее сообщество
Bogdan Khamitov
Вот полностью метод . Он отрабатывает нормально . Но мне нужно понять , когда он выполнится полностью. И для этого мне посоветовали использовать forkJoin .Можно ли как то преобразовать данный код в forkJoin . Или как то подписаться , чтобы понять что все данные пришли ?
                                getAllDataFromDb(){  
                                 return this.db.getAllDataFromDb().toPromise().then(dbData => {
                                   console.log('getAllDataFromDb',dbData);
                                   for(let i = 0; i < Object.keys(dbData).length; i++){
                                           this.facebookService.getDataOfAds(dbData[i].token)
                                           .toPromise()
                                           .then(response => {
                                             this.ls.addItem(response,dbData[i]);
                                             this.filter();  
                                           })
                                           .catch((err:any) => {
                                             console.log(err);
                                           });
                                         }
                                       })
                                 //если ошибка
                                 .catch((err:any) => {
                                   console.log(err);
                                 });  
                               }
const getData = (token: any): Observable<any> => this
       .facebookService
       .getDataOfAds(token).pipe(
           tap(response => {
               console.log("304",response);
               this.ls.addItem(response,dbData[key]);
           }),
           catchError(error => {
               console.log(error)
           })
       );
   
   const getAll = (dbData) : Observable<any> => {
       const keys = Object.keys(dbData);

       return forkJoin(
           keys.map(key => getData(key))
       );
   }
   
   return this.db.getAllDataFromDb().pipe(
       switchMap(dbData => getAll(dbData))
   );


Разбейте так как нибудь
источник

BK

Bogdan Khamitov in Angular - русскоговорящее сообщество
Oleg Safonov
const getData = (token: any): Observable<any> => this
       .facebookService
       .getDataOfAds(token).pipe(
           tap(response => {
               console.log("304",response);
               this.ls.addItem(response,dbData[key]);
           }),
           catchError(error => {
               console.log(error)
           })
       );
   
   const getAll = (dbData) : Observable<any> => {
       const keys = Object.keys(dbData);

       return forkJoin(
           keys.map(key => getData(key))
       );
   }
   
   return this.db.getAllDataFromDb().pipe(
       switchMap(dbData => getAll(dbData))
   );


Разбейте так как нибудь
Я не понимаю этот код .Мне только один запрос нужно обработать,чтобы подождать пока все данные придут и потом выполнить 1 метод и все . Понятно что это костыльный код . Но все же,можно как то из моего кода узнать , что все данные пришли ? Или дайте пожалуйста ссылку на материал (видео , статья ) , чтобы ознакомиться с observable .Где понятным языком написано
источник

OS

Oleg Safonov in Angular - русскоговорящее сообщество
Bogdan Khamitov
Я не понимаю этот код .Мне только один запрос нужно обработать,чтобы подождать пока все данные придут и потом выполнить 1 метод и все . Понятно что это костыльный код . Но все же,можно как то из моего кода узнать , что все данные пришли ? Или дайте пожалуйста ссылку на материал (видео , статья ) , чтобы ознакомиться с observable .Где понятным языком написано
источник

S

Smooth Operator in Angular - русскоговорящее сообщество
может просто долгий процесс
источник

TT

Taras Tarchanskyi in Angular - русскоговорящее сообщество
а есть какой-то вариант вытащить число (1) с url http://localhost:4200/server/1/user_reg

кроме как this.router.url.charAt()?

это ID, но вытаскивать я его пытаюсь в отдельном модуле, который загружен через lazy loading и this.route.snapshot.paramMap.get('serverID') не работает там, а передавать параметры в <router-outlet></router-outlet> нельзя, как я понимаю
источник

В

Владос in Angular - русскоговорящее сообщество
Регуляркой
источник

TT

Taras Tarchanskyi in Angular - русскоговорящее сообщество
Владос
Регуляркой
ну да, ею правильней а то вдруг там число 10 будет, но все равно такое ощущение, будто-бы костыль
источник

В

Владос in Angular - русскоговорящее сообщество
Ну ты ожешь взять строкой, если у тебя сервер будет постоянно указан то от / до / посмотреть что за число
источник

IF

Ivan Frolkin in Angular - русскоговорящее сообщество
Taras Tarchanskyi
а есть какой-то вариант вытащить число (1) с url http://localhost:4200/server/1/user_reg

кроме как this.router.url.charAt()?

это ID, но вытаскивать я его пытаюсь в отдельном модуле, который загружен через lazy loading и this.route.snapshot.paramMap.get('serverID') не работает там, а передавать параметры в <router-outlet></router-outlet> нельзя, как я понимаю
ActivatedRoute же
источник

BK

Bogdan Khamitov in Angular - русскоговорящее сообщество
Переписал код на более-менее понятный.  Я хочу , чтобы когда все запросы выполнятся в forkJoin , то можно было выполнить другую функцию.Я в курсе , что если будет хоть одна ошибка в observable в forkJoin , то весь запрос идет в ошибку.Но я вроде отлавливаю ошибку и обрабатываю её , но тем не менее весь запрос идет в ошибку.Подскажите , как решить это

                                                 let dbData;
                                                 this.db.getAllDataFromDb()
                                                 .subscribe(value => {
                                                   dbData = value;
                                                   console.log(dbData);
                                                 },
                                                 err => {
                                                   console.error('Oops:', err.message);
                                                 },
                                                 () => {
                                                   forkJoin(Object.keys(dbData)
                                                     .map((key) => {
                                                       this.facebookService.getDataOfAds(dbData[key].token)
                                                       .pipe(catchError(error => of(error)))
                                                       .subscribe(value => {
                                                         this.ls.addItem(value,dbData[key]);
                                                       },
                                                       err => {
                                                         console.error('Oops:', err.message);
                                                       }),
                                                       () => {}
                                                       // this.ls.addItem(dbData,dbData[key]);
                                                     })).subscribe(() =>
                                                   console.log("success")
                                                   );
                                                   });
источник

AS

Anton Shvets in Angular - русскоговорящее сообщество
Bogdan Khamitov
Переписал код на более-менее понятный.  Я хочу , чтобы когда все запросы выполнятся в forkJoin , то можно было выполнить другую функцию.Я в курсе , что если будет хоть одна ошибка в observable в forkJoin , то весь запрос идет в ошибку.Но я вроде отлавливаю ошибку и обрабатываю её , но тем не менее весь запрос идет в ошибку.Подскажите , как решить это

                                                 let dbData;
                                                 this.db.getAllDataFromDb()
                                                 .subscribe(value => {
                                                   dbData = value;
                                                   console.log(dbData);
                                                 },
                                                 err => {
                                                   console.error('Oops:', err.message);
                                                 },
                                                 () => {
                                                   forkJoin(Object.keys(dbData)
                                                     .map((key) => {
                                                       this.facebookService.getDataOfAds(dbData[key].token)
                                                       .pipe(catchError(error => of(error)))
                                                       .subscribe(value => {
                                                         this.ls.addItem(value,dbData[key]);
                                                       },
                                                       err => {
                                                         console.error('Oops:', err.message);
                                                       }),
                                                       () => {}
                                                       // this.ls.addItem(dbData,dbData[key]);
                                                     })).subscribe(() =>
                                                   console.log("success")
                                                   );
                                                   });
откуда у тебя внутри forkJoin взялся subscribe
источник

BK

Bogdan Khamitov in Angular - русскоговорящее сообщество
Anton Shvets
откуда у тебя внутри forkJoin взялся subscribe
где он должен быть ?
источник

AS

Anton Shvets in Angular - русскоговорящее сообщество
Bogdan Khamitov
где он должен быть ?
внизу один.
и создавай массив обсерваблов где-нибудьи ли в методе или в переменную. нифига ж нечитаемо
источник

AS

Anton Shvets in Angular - русскоговорящее сообщество
Bogdan Khamitov
где он должен быть ?
subscribe это как пинок, чтобы заставить поток двигаться. Он в конце один единственный должен быть. А еще лучше и без него.
источник

BK

Bogdan Khamitov in Angular - русскоговорящее сообщество
Anton Shvets
subscribe это как пинок, чтобы заставить поток двигаться. Он в конце один единственный должен быть. А еще лучше и без него.
как тогда можно узнать без него , что все выполнилось в forkJoin?
источник

AS

Anton Shvets in Angular - русскоговорящее сообщество
Bogdan Khamitov
как тогда можно узнать без него , что все выполнилось в forkJoin?
сделай хотя бы  с одним
источник

V

Vitaliy in Angular - русскоговорящее сообщество
Help plz
источник

BK

Bogdan Khamitov in Angular - русскоговорящее сообщество
Anton Shvets
внизу один.
и создавай массив обсерваблов где-нибудьи ли в методе или в переменную. нифига ж нечитаемо
внизу это где ? Я куда не вставляю , везьде ошибку пишет  (
источник