• Как в RxJs выполнить функцию если значение BehaviourSubject true, а если false - то ждать пока не станет true?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    source.pipe(
      switchMap( value => myBooleanSubject.pipe(filter(Boolean), mapTo(value)))
    )
      .subscribe(value => ...)
    Ответ написан
    Комментировать
  • Какое преимущество при использовании внедрения зависимости?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    В твоем примере зависимость создается внутри класса, а в примере выше зависимость уже создана и передается в класс при создании его экземляра.

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

    Так же di предоставляет больше гибкости, инжектор это своего рода внешняя переменная, которую можно подменить. Что удобно при тестировании или при использовании в контексте.
    Ответ написан
    Комментировать
  • За сколько времени можно выучить основу Angular, если хорошо знаю React js?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    Про версии это бред, Ангуляр практически не изменяется, самое крупные изменения были в начальных версиях при царе горохе.
    По времени я бы сказал пару вечеров на основы, но если тебе на Vue понадобилась целая неделя, то на ангуляр я думаю будет точно не меньше. За это время в принципе можно с нуля до выполнения тестового на джуна осилить.
    Ответ написан
  • Стоит ли использовать esbuild для сборки фронта сегодня?

    Xuxicheta
    @Xuxicheta
    инженер
    Последнее время поглядываю на esbuild сидя на webpack.


    Ну так можно с вебпака никуда не слезать, а для начала собирать js с помощью esbuild-loader вместо бабеля и ts.
    Ответ написан
    Комментировать
  • Как настроить роутинг/прокси между Angular приложениями, запущенными вместе?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    ниче не понятно, чего куда.
    Возможно вам поможет понимание того, как работает прокси.

    При запуске дев сервера мы запускаем сервер на ноде который умеет слушать сеть по указанному порту и отдавать статические файлы, собранные вебпаком.
    Далее в браузере мы отправляемся по ссылке типа "/api" которая пойдет на тот же самый хост и порт, на котором работает страничка. Этот запрос придет туда же, откуда страница взята, т.е. на наш nodejs сервер.
    И там включается разбор запросов, который говорит "ага, вот адрес /api у нас должен проксироваться вот сюда" и сервер на ноде делает самостоятельно запрос по указанному в proxy конфиге адресу, передавая туда же все данные из запроса. Получив ответ, он отправит его под видом ответа от ноде-сервера, который попадет в браузер.

    Зачем вообще нам прокси? Чтобы браузер считал что он никуда далеко не ходит, и OPTIONS не слал. И для того чтобы лишние пути во фронте не прописывать, изменить адреса бэкендов для разработки можно подсунув другой конфиг.

    А теперь какие такие другие url? Если пойти из браузера по другому url в запущенный прокси он не попадет никогда, если не совпадет айпи адрес хоста и порт.

    Прокси поможет развести запросы к разным бэкендам, так, что со стороны браузера они выглядят как уходящие к одному хосту.
    Причем тут разные фронтовые аппы вообще не понятно.
    Ответ написан
  • Нужно ли везде использовать TypeScript? или это хайп?

    Xuxicheta
    @Xuxicheta
    инженер
    Нужно ли везде использовать TypeScript?

    ну видимо нет.

    или это хайп?

    нет

    Есть ли смысл использовать Typescript в пет проектах?

    Писать на ts тупо удобнее, отлавливает сразу простые ошибки и предоставляет автодополнение и информацию о сигнатурах.

    типа создал мини игру 15 строчках кода на TypeScript?

    как хотите, ради 15 строчек мне было бы лень настраивать конфиг, но я бы точно писал всегда на ts если бы оно поддерживалось по дефолту.

    Или он только в крупных проектах нужен? и вообще все прям без него будто не могут писать судя по отзывам или это какойто хайп или реклама Microsoft

    еще раз. ts - удобнее и надежней.
    Ответ написан
    2 комментария
  • Как можно определить класс, который имплементирует интерфейс через html?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    потому что implements существует только в typescript, в виде помощи добрым советом программисту, и исчезает при компиляции.
    Ответ написан
    Комментировать
  • Как изолировать модуль администратора от всего сайта на Angular?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    выглядит как nested applications
    https://medium.com/disney-streaming/combining-mult...

    т.е. вам нужно сделать сначала корневой апп, вставить туда существующий, и добавить еще админский сбоку.
    Ответ написан
    3 комментария
  • Зачем использовать провайдер в компоненте?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    1. импорт ничего не значит. Это просто получение ссылки в текущую область видимости. Этим занимается вебпак.
    2. providers - указание инжектору, что он должен знать вот о таких сущностях. В данном случае для локального инжектора, к которому имеет доступ текущий компонент и его вложенные.
    Этот инжектор создается перед созданием компонента и умирает после. Также, при умирании будет вызван хук ngOnDestroy у всех инстансов провайдеров в этом инжекторе.
    3. Указывая в конструкторе тип, мы сообщаем инжектору какие данные мы хотим получить (тут HeroServiceProvider это токен, т.к. указатель), перед тем как создать эксземпляр класса, а конкретно HeroesComponent.
    Инжектор смотрит есть ли у него такие, а если нет, то создает и передает в конструктор. Инстанс HeroServiceProvider будет создан и виден только в HeroesComponent или его вложенных.
    Ответ написан
    Комментировать
  • Как в приложении Angular загружать разные модули для админа и обычного пользователя?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    Переадресацию на разные роуты.
    Конечно, часто разработчики хотят сделать так, чтоб один роут для разных прав показывал разное, теоретически это можно реализовать подменяя конфиг роутера, но я склоняюсь к тому, что путь однозначно должен соответствовать содержимому. Рассматривайте картинку на экране как функцию от роута и данных. Чем проще соответствие, тем лучше.
    Ответ написан
    Комментировать
  • Как правильно закешировать каждый отдельный элемент через observable & shareReplay?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    1. Создаете функцию получения данных,
    myRequest = () => request.pipe(shareReplay(1));
    2. создаете переменную чето типа
    list = myRequest();

    Это у вас список элементов, при подписке на него выполняется запрос и кешируется. При следующей подписке отдается кэш.

    3.
    getById = (id) => list.pipe(map(_list => _list.find(filterById(id)))


    функция, которая вернет обсервабл с зашитой в него функцией поиска.
    например
    elementId1 = getById(1);

    При подписке на elementId1 будет см. п. 2, а потом поиск в списке.
    При вызове getById(2) будет использован тот же самый кэш.

    Если проигнорить пункт 2 с записью результата вызова myRequestв переменную и внутри getByIdвызвать функцию myRequestто будет создан второй "кэш" и соответственно второй запрос.
    ____
    так же getByIdтоже можно закэшировать своим shareReplayчтобы не искать второй раз, если у нас где-то будет две подписки на этот элемент.
    Ответ написан
    Комментировать
  • Как вызвать функцию после изменение ngModel?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    Реактивную форму сделайте, и будет вам Observable
    А вообще [(ngModel)] это сахар для [ngModel]="name" (ngModelChange)="name = $event"

    А ngChange это из angular.js
    Ответ написан
    Комментировать
  • Такая запись деструктуризации считается ограничением а нгуляре?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    1. destructuring assignments в микросинтаксисе структурок не работает https://github.com/angular/angular/issues/27555

    2. лучше писать так
    <div *ngFor="let entry of obj | keyvalue">
      {{ entry.key }} {{ entry.value }}
    </div>
    Ответ написан
    Комментировать
  • Как правильно записать в Angular стили в ngStyle?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    backgroundImage

    А вообще рекомендую описывать стили таким вот образом, читается лучше
    https://stackblitz.com/edit/angular-ivy-3nwfzl?fil...
    Ответ написан
    Комментировать
  • Почему при установке ng new my-app The Schematic workflow failed. See above?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    Ну видимо чето сырое в прод попало. Попробуйте поставить @angular/cli постарее.
    npm i -g @angular/cli@версия
    Версии можно тут посмотреть https://www.npmjs.com/package/@angular/cli
    Ответ написан
  • В чем отличие markAsDirty и markAsTouched в Angular?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    В Angular в ReactiveForm одному контролу из формы я задаю значение через .setValue(someValue)

    Внутри любого метода меняющего форму или ее значение есть updateValueAndValidity.
    Как я понимаю, чтобы после этого запустился процесс валидации установленного значения, нужно выполнить у этого же контрола методы markAsDirty() и markAsTouched()

    Нет, эти методы всего лишь флаги меняют, dirty и pristine соответственно. И к процессу валидации никак не относятся.
    Какая между ними разница и когда какой использовать?

    нy по назначению, dirty это когда форма менялась, touched это когда на контроле был фокус и пропал.
    Ответ написан
    Комментировать
  • Как запомнить значение переменной Angular?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    getData() {
      return this.http.get(url).pipe(shareReplay())
    }


    и не надо ничего лишнего городить, никаких сабжектов
    Ответ написан
    2 комментария
  • Как правильно сделать поиск на rxjs?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    fullName$ = formControl.valueChanges.pipe(
      switchMap((value: string) => this.ufopService.getOrganization(value)),
      map((organization:  Organization | null) => organization?.fullName ??  '')
    )


    внутри getOrganization проверять на вашу длину.
    Ответ написан
    2 комментария
  • Почему в href не выполняется выражение?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    Не увлекайтесь такими штуками. Вычислите href в компоненте заранее, положите в свойство.
    Оно мало того что в шаблоне это не совсем js, это все парсится ангуляром. Оно еще каждый раз вычисляться заново будет.
    Ответ написан
    Комментировать
  • Почему Angular обновляет переменную в DOM только один раз?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    1. Все меняющиеся во времени сущности храни в Observable
    2. Observable, который надо изменить снаружи называется Subject. Его разновидности, которые умеют помнить значения называются ReplaySubject (изначально пустой) и BehaviorSubject (изначально должен быть инициализирован).
    3. Забирай ссылки на данные из сервиса в компонент.
    4. Не подписывавайся на них, сразу вставляй в шаблон через asyncPipe

    Пример.
    В сервисе
    private flagSource = new BehaviorSubject(false);
    public flag: Observable<boolean> = this.flagSource;
    
    setFlag(value: boolean) {
       this.flagSource .next(value);
    }


    в компоненте
    flag = this.myService.flag;

    в шаблоне
    <div *ngIf="flag | async">

    asyncPipe следит за обсерваблом и заставляет компонент поучаствовать в детекции изменений
    Ответ написан
    Комментировать