Ответы пользователя по тегу Angular
  • Как имзенить порядок валидации в Angular5?

    @dmitrygavrish
    Можно написать свою функцию-валидатор, например так:
    function validateInSequence(
        ...validators: ( (formControl: FormControl) => any )[]
    ): (formControl: FormControl) => any {
        return function (formControl: FormControl): any {
            for (let i = 0; i < validators.length; i++) {
                const validationResult = validators[i](formControl);
    
                if (validationResult !== null) {
                    return validationResult;
                }
            }
    
            return null;
        };
    }

    И использовать ее таким образом:
    new FormControl('', [validateInSequence(Validators.required, Validators.email)]);
    Ответ написан
    Комментировать
  • Как пофиксить Can't bind to 'queryParams' since it isn't a known property of 'a'?

    @dmitrygavrish
    Судя по коду шаблона, который выведен в сообщении об ошибке, у вас ссылке не задан [routerLink]="/some-route", т.е. ссылка на какой-либо роут вашего приложения.
    Выглядеть будет примерно так:
    <a [routerLink]="..." [queryParams]="{category: item}" ... > ... </a>
    Ответ написан
    1 комментарий
  • Как отключить компонент во время билда?

    @dmitrygavrish
    В src/environments лежат environment.ts, environment.prod.ts. В дев режиме используется первый, в прод - второй. И по дефолту там есть как минимум одно поле - production: true/false.

    Соответственно в вашем файле модуля пишем что-то подобное:
    let declarations = [SomeComponent];
    
    if (!environment.production) {
     const devDeclarations = [/*ваши дев компоненты*/];
     declarations = declarations.concat(devDeclarations); // равносильно [...declarations, ...devDeclarations]
    }
    
    @NgModule({
      declarations,
      /*...*/
    })
    export class SomeModuleClass {}
    Ответ написан
    1 комментарий
  • Как на angular 5 открыть страницу в упрощенном окне браузера?

    @dmitrygavrish
    Используйте window.open - https://developer.mozilla.org/en-US/docs/Web/API/W...
    Для примера:
    window.open('https://google.com', null, 'menubar=off,toolbar=off')

    Учтите, что поведение данного метода от браузера к браузеру отличается.
    Ответ написан
  • Как приводить ответ HttpClient к конкретному типу?

    @dmitrygavrish
    Ангуляр тут ни при чем, он не может на основании типа, указанного в дженерике, создать инстанс класса, потому что это тип, а не конструктор класса.
    Любой подобный пример в тайпскрипте вызовет ошибку:
    function someFunction<T>(): T {
        return new T();
    }

    П.С. в вашем случае можно сделать несколько лаконичнее:
    return this.http
        .get<Person>("http://test/api/v1/person/view", config)
        .map(p => new Person(p));

    Только для этого конструктор класса Person должен уметь записывать себе внутрь св-ва из передаваемого в конструктор объекта.
    Ответ написан
    3 комментария
  • Как правильно доделать таймер через rxjs?

    @dmitrygavrish
    Если вам не нужен бесконечный таймер, то проще будет от него отказаться. По поводу решения "после изменения isBlocked на true нужно сразу же слать запрос" - создайте свою последовательность, которую вы будете в нужный момент итерировать с нужным вам значением (код для примера):
    class SomeComponent {
        private _isBlocked$$: Subject<boolean> = new Subject();
        public isBlocked$: Observable<boolean> = this._isBlocked$$.asObservable();
    
        public ngOnInit(): void {
            this.isBlocked$
                .switchMap((isBlocked: boolean) =>
                    isBlocked ? this.http.post(apiPath) : Observable.of(null))
                .subscribe((data: Array<any>) => {
                    if (data !== null) {
                        this.notise = this.mapData(data);
                    }
                });
        }
    
        public someMethod(bool: boolean): void {
            this._isBlocked$$.next(bool);
        }
    }


    Если все-таки хотите оставить таймер и остановить в конкретный момент, то подойдет takeUntil:
    Observable.timer(0, 2000).takeUntil(this.isBlocked$)
    Ответ написан
    Комментировать
  • Как происходит отписка через takeUntil?

    @dmitrygavrish
    1) Правильно ли я понимаю, что первая строчка передаёт в Subject пустое значение(но всё же значение) и это заставляет Subject излучить хоть что-то?

    Все верно. В коде указан тип
    private ngUnsubscribe: Subject<void> = new Subject<void>();
    , cледовательно ничего кроме "пустого" значения передать в .next() компилятор тайпскрипта и не разрешит.

    2) А по поводу this.ngUnsubscribe.complete();

    The Observer callback to receive a valueless notification of type complete from the Observable. Notifies the Observer that the Observable has finished sending push-based notifications.

    Т.е., судя по всему, никто больше слушать данную последовательность не будет/не сможет после вызова данного метода
    Ответ написан
    Комментировать
  • Правильно ли использовать node.js в качестве rest api сервера?

    @dmitrygavrish
    1) "Польза" асинхронности в том, что запрос к БД будет неблокирующим, т.е. не будет блокировать выполнение кода нодой пока БД обрабатывает запрос и формирует ответ

    2) node.js все равно, с какой БД вы работаете, для того же постгреса есть множество готовых модулей:
    https://www.npmjs.com/package/pg
    https://www.npmjs.com/package/pg-promise
    https://www.npmjs.com/package/pg-format
    ORM:
    https://www.npmjs.com/package/sequelize

    3) Если ваша цель - написать приложение за минимальное кол-во времени и приложив минимальное кол-во усилий, то пишите на том, в чем вы разбираетесь. Если хотите прокачать скилы в другой области (языке/платформе/...), то можете взять node.js, как вариант.

    П.С. нода, в отличие от ПХП, может хранить состояние в рамках всей жизни запущенного процесса (в т.ч. и в кластере), что может существенно облегчить задачу создания приложения на веб-сокетах, если вам потребуется работа с таймерами
    Ответ написан
    Комментировать
  • Как динамически проверять путь роута в Angular 5?

    @dmitrygavrish
    Для начала можно изменить формат даты и использовать в качестве разделителя, например, дефис (20-12-2018).

    Решается следующим образом:
    1) в конструктор компонента инжектим private _activatedRoute: ActivatedRoute и private _router: Router
    2) подписываемся (предпочтительней в ngOnInit) на ActivatedRoute и обрабатываем значение параметра роута:
    this._activatedRoute.paramMap.subscribe((params: ParamMap) => {
        let date: string = params.get('date'); 
    
        if (/*если дата неправильна*/) {
          date = ...; // изменим дату на корректную
          this._router.navigate(['/date', date]);
        }
      })


    Если потребуется валидировать дату с помощью нативного js конструктора Date, учтите, что валидным будет создание объекта new Date('mm-dd-yyyy'), т.е. new Date('20-12-2018') выдаст Invalid Date, т.к. 20-ого месяца не существует.
    Ответ написан
    Комментировать