• На что в данном случае указывает this?

    Xuxicheta
    @Xuxicheta
    инженер
    Смею предположить, что во время выполнения конструкции . . . new Dev( . . . ) интерпритатор ещё не знает про объект c?

    Во время выполнения вашего new переменная c объявлена, но не проинициализирована, и ее значение undefined
    Присвоение ей значения произойдет после того как отработает правая часть выражения, после знака присваивания.

    Это происходит из-за поднятия объявлений переменных через var.
    А поскольку function Dev у вас в том же скоупе, то c попадает в нее через замыкание.
    Ответ написан
  • Как в angular правильно вызвать асинхронный метод с параметром из html разметки?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    <span>{{ getAddressByCode(addressCode) | async }}</span>

    AsyncPipe умеет раскрывать промисы.
    Разумеется метод будет вызываться каждый раз при проверке изменений.


    существует ли возможность в ангуляре вызывать нормальные async методы, а не только RxJs?

    Angular это все еще js и работать с асинками в нем можно. Но как правило не нужно потому, что создаются совершенно лишние обертки, rx просто удобнее.
    Для реквестов используется xhr, и его событийная природа легко конвертируется в rx поток.
    Ответ написан
  • Как работает import в angular и какая оптимизация от sharedModule?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    Импорт модуля1 в модуль2 инициализирует инжектор модуля1 и он становится доступен для инжектора модуля2.
    Создаются экземпляры провайдеров модуля1, и декларируемые сущности модуля 1 и новые экземляры провайдеров модуля1 становятся видимыми для модуля2.
    Компоненты импортировать нельзя.

    Расположение по бандлам определяет вебпак, если нет лейзи модулей то все будет в main. Если будут лейзи, то общие импорты скорее всего тоже попадут в main.
    Ваш вариант 2 ближе к реальности.
    SharedModule не нужен. Он служит типа аггрегатором для разделяемых модулей, чтобы меньше было строчек в импортах.
    Ответ написан
    1 комментарий
  • Почему не могу вызвать прототип внутри функции?

    Xuxicheta
    @Xuxicheta
    инженер
    this у вас в данном случае указывает на глобальный объект.
    Если вызвать Quest с new, то this будет указывать на новосозданный объект и Quest будет для него конструктором, тогда answers добавятся в прототип этого объекта.
    Но this.prototype.answers все равно не сработает, т.к. prototype это свойство функции в котором хранится ссылка на объект который станет прототипом для всех объектов созданных этой функцией как конструктором.
    Следует обращаться просто к this.answers
    Ответ написан
  • Слайдер на страницах в портфолио джуна. Писать велик или использовать библиотеку?

    Xuxicheta
    @Xuxicheta
    инженер
    Если вы хотите написать свой слайдер, оформите его отдельным пакетом.
    Ответ написан
    Комментировать
  • Почему js так считает числа в данном примере?

    Xuxicheta
    @Xuxicheta
    инженер
    https://habr.com/ru/post/309812/
    Суть в том, что не все конечные десятичные дроби можно записать как конечные двоичные дроби. Поэтому появляются нелогичные на первый взгляд хвосты.
    Надо всегда помнить что при операциях с флоатами надо определять какую-то точность.
    0,1+0,2 == 0,3 будет верным, если принять точность до пяти разрядов например.
    Ответ написан
    Комментировать
  • Возраст junior во frontend?

    Xuxicheta
    @Xuxicheta
    инженер
    Вы не с того конца смотрите на проблему. Вопрос не в возрасте, а хватит ли у вас запала освоить все что нужно. Для этого надо иметь интерес к работе, быть готовым впитывать все новые и новые знания ну и соображать.
    Нужно ли оно - вот в чем вопрос. Если само не заходит, то скорее всего нет. Если заходит, то нет проблем, есть лишь временные трудности.

    Я сменил профессию в возрасте побольше вашего, но такими вопросами вообще не задавался, просто искал работу, и этап джуна прошел очень быстро, хотя только сейчас начинаю осознавать сколько на самом деле я не знаю. Ну и большинство 20-летних вообще не конкуренты на самом деле.
    Чаще решает даже не скилл программирования, а способность разобраться в задаче и найти пути ее решения так как это требуется для бизнеса.
    Ответ написан
    Комментировать
  • Angular: как получить данные от апи и объявить переменные глобально?

    Xuxicheta
    @Xuxicheta
    инженер
    пройстейший сервис чтобы один раз спросить бэкенд, закешировать и отдавать потом компонентам, чтобы они подписывались.
    @Injectable({
      providedIn: 'root'
    })
    class UserService {
      private user$;
      
      constructor(private http: HttpClient) {}
    
      fetchUser(): Observable<User> {
        if (!this.user$) {
          this.user$ = this.http.get('/server/api/userService').pipe(shareReplay(1))
       }
       return this.user$;
     }
    }


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

    И этот код не принесет вам пользы, если вы не понимаете что он делает.
    Ответ написан
  • Подписаться на роут?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    Нужно либо сменить роут, например добавив хэш или query param
    Либо выключить переиспользование компонента, тогда на каждый клик компонент будет инициализироваться заново. Поместив вот это куда-нибудь выше, например в app.component
    constructor(
        private router: Router,
      ) {
        this.router.routeReuseStrategy.shouldReuseRoute = function () {
          return false;
        };
        this.router.events.subscribe((evt) => {
          if (evt instanceof NavigationEnd) {
            this.router.navigated = false;
          }
        });
      }


    Есть так же вариант ловить все клики по routerLink и вызов navigate

    upd.
    а вообще вы же должны понимать, что вам не роут надо отслеживать, а выполнить ваши действия
    1. при инициализации компонента.
    2. при нажатии на кнопку.
    Выносится в метод и вызывается в нужном месте.
    Ответ написан
  • Как реализовать правильно данный Guard?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
      return this.auth.getUser().pipe( map(user => user.err == 0));
    }
    Ответ написан
  • Действительно ли reduce, filter, map и прочие работают медленнее обычного for?

    Xuxicheta
    @Xuxicheta
    инженер
    Сегодня быстрее, завтра не быстрее, послезавтра быстрее.
    Перфоманс таких вещей зависит от реализации js и будет разным на разных движках и версиях.
    Без веских причин не стоит экономить на спичках жертвуя читабельностью.
    Будь методы перебора массивов не нужны, их не сделали бы, правда ведь?
    Ответ написан
    6 комментариев
  • Что не так? В чем ошибка?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    потому что
    export class Task1Module {
      constructor(
        public distance:Observable<distance>,
        public convert_to:string
      ) {
      }
    }


    поле distance это Observable, а у него нет свойства unit
    а потом вы еще convert_out.value пытаетесь число присвоить, а оно является строкой.

    Пишите все по человечески и такое будет сразу видно.
    Ответ написан
  • Как блокировать @HostListener прослушку?

    Xuxicheta
    @Xuxicheta
    инженер
    Не совсем понял момент насчет setTimeout.
    В коде мат-диалога есть такое
    // The logic that disposes of the overlay depends on the exit animation completing, however
          // it isn't guaranteed if the parent view is destroyed while it's running. Add a fallback
          // timeout which will clean everything up if the animation hasn't fired within the specified
          // amount of time plus 100ms. We don't need to run this outside the NgZone, because for the
          // vast majority of cases the timeout will have been cleared before it has the chance to fire.
    this._closeFallbackTimeout = setTimeout(() => {
            this._overlayRef.dispose();
          }, event.totalTime + 100);

    overlayRef.dispose() производит отвязывание от событий клавиатуры.
    Как я понял вы по той же причине хотите таймаут, т.к. видимо OnDestroy срабатывает раньше отписок, хотя по коду должен бы после.
    Материал довольно сложно устроен и я не стал бы на это полагаться :)

    Не проще ли сделать глобальный серсвис с событями клавиатуры, диалоговые окна запускать с disableClose: true, при открытие окна блокировать события сервиса для всех, кроме диалога, а сам диалог закрывать руками при получении события эскейпа и сразу снимать блокирование?
    Ответ написан
  • Ввод только цифр?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    import { Directive } from '@angular/core';
    import { NgControl } from '@angular/forms';
    import { Subscription } from 'rxjs';
    
    @Directive({
      selector: '[numbers]',
    })
    export class NumbersDirective  {
      sub = new Subscription();
    
      constructor(
        private ngControl: NgControl
      ) { }
    
      ngOnInit() {
        this.sub = this.ngControl.valueChanges.subscribe(value => {
          this.ngControl.control.setValue(
            (value || '').replace(/[^0-9]*/g, ''),
            { emitEvent: false },
          )
        });
      }
      ngOnDestroy() {
        this.sub.unsubscribe();
      }
    }
    Ответ написан
    Комментировать
  • Перенос контента навигации из одного контейнера в другой?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    https://ng-run.com/edit/mGpNNV5K4mQirnqoMJty

    Предлагаю самостоятельно оптимизировать, перевести на потоки, сделать OnPush, разбить на компоненты и сервисы и сделать все еще более абстрактно и реюзабельно.
    Ответ написан
    2 комментария
  • Как сделать простое настольное приложение на JavaScript?

    Xuxicheta
    @Xuxicheta
    инженер

    Желательно конечно чтобы его можно было с минимальными усилиями потом перенести в веб.


    Делаешь обычный сайт на чем угодно, оформляешь к нему манифест PWA и можно устанавливать как обычное приложение на десктоп. Оно закеширует скрипты в сервис-воркере и не надо будет каждый раз скачивать.
    Electron не нужен.

    Вот например официальный сайт Angular удовлетворяет требованиям PWA и может быть инсталлирован
    5def8b9db9bbc873815458.png
    Ответ написан
    Комментировать
  • Как связать front-end на Angular и back-end asp.net core?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    МС конкретно намутила воду пытаясь в свой фреймворк адаптировать для SPA.
    Мыслите по другому.
    Если вам нужно веб-приложение, веб-приложение состоит из двух частей (как минимум) - фронт и бэк.
    Фронт это гора скриптов, которые пользователь получает от статик веб-сервера. Бэк - логика, которая умеет общаться с бд и отвечает по протоколу, доступному для фронта.
    Поскольку asp.net это такая крупная энтерпрайз штука, то и фреймворк для фронта МС выбрали крупный, энтерпрайзный - Ангуляр и попытались интегрироватся с ним как могли. (Странно что МС не нашла очередной фатальный недостаток и не взялась пилить собственный веб-фрейм)
    Спасибо им конечно, но по факту это два разных относительно незавимых приложения все равно и в доке Ангуляра вы про asp.net не найдете ничего.

    И возвращаясь к сути вопроса, да, фронт делает http запросы на бэк. Асинхронные запросы в обе стороны тоже возможны, через websocket.
    Ответ написан
  • Как перехватывать все ошибки в приложении, если некоторые функции уже обернуты в try ... catch?

    Xuxicheta
    @Xuxicheta
    инженер
    Правильный ответ - не нужно все ошибки обрабатывать в одном месте.
    А вообще если нужна промежуточная обработка ошибок, делают проброс ошибки дальше
    function mayBeError() {
      try {
        throw new Error('iiii')
      } catch (e) {
        console.error('error in mayBeError');
        throw e;
      }
    }

    Функции должны выкидывать свои ошибки вовне, это нормально.

    Централизованного способа нет и было бы странно если бы он был, иногда исключений просто куча. Их могут в логике использовать.

    Можно только неперехваченные ошибки ловить, через
    для браузера событие error
    window.onerror = function (message, file, line, col, error) {
       console.warn("Error occurred: " + error.message);
       return false;
    };

    и для ноды событие uncaughtException
    https://nodejs.org/api/process.html#process_event_...
    Ответ написан
    Комментировать
  • Как выполнить скрытие и показ одновременно?

    Xuxicheta
    @Xuxicheta
    инженер
    Оно и происходит одновременно, но у вас max-height: 1000px; transition: max-height 1s;
    Когда вы делает клик, максимальная высота одного начинает увеличиваться с 0 до 1000, а у друго уменьшаться с 1000 до 0. В течении секунды аж.
    У которого от 0 до 1000 max-height быстро вырастет на достаточную величину чтобы показать элемент, а когда с тысячи едет, элемент пропадает из виду почти в самом конце анимации.

    Решение - уменьшить время анимации и уменьшить высоту.
    Ответ написан