Size: a a a

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

2020 March 16

АЧ

Артур Чернуха... in Angular - русскоговорящее сообщество
Вертихвост キバ 🏡🦊
Если только немного позже, сейчас не за ноутом)
Хорошо, спасибо. Буду пока читать в области Injection Token (если правильно нагуглил) и Вашей идеи как таковой.
источник

MF

Murat Faiz in Angular - русскоговорящее сообщество
Добрый день.
Пытаюсь использовать Transloco v2.13.5.
this.translocoService.setActiveLang(language);
- не это ли переводит языки с одного на другой?
И есть ли проблемы Transloco с Material Angular?
источник

S

Sergey in Angular - русскоговорящее сообщество
ngx-translate юзай
источник

DT

Dmitry Teplov in Angular - русскоговорящее сообщество
Sergey
ngx-translate юзай
по какой причине?
источник

S

Sergey in Angular - русскоговорящее сообщество
он точно работает)
источник

AP

Andrey Panasenko in Angular - русскоговорящее сообщество
Всем привет. У меня есть модуль CustomizationModule, который поддерживает конфигурирование через forRoot. В дев режиме или прод. режиме без AOT все работает прекрасно, но при компиляции с AOT.  Вопрос, как можно пофиксить ошибку при компиляции в прод режиме с включенной aot компиляцией
ERROR in src/app/private/private.module.ts(26,9): Error during template compile of 'PrivateModule'
 Function calls are not supported in decorators but 'CustomizationOptions' was called.
src/app/private/private.module.ts(26,9): Error during template compile of 'PrivateModule'
 Function calls are not supported in decorators but 'CustomizationOptions' was called.

Версия компилятора:     "@angular/compiler": "~8.2.14", @angular/cli": "~8.3.25"

Конфигурирующий модуль:
javascript
import { InjectionToken, ModuleWithProviders, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { PrivateRoutingModule } from './private-routing.module';
import { HomeComponent } from './home.component';
import { NgZorroAntdModule } from 'ng-zorro-antd';
import { FormsModule } from '@angular/forms';
import { SharedModule } from '@app/shared/shared.module';
import { SegmentsModule } from '@private/segments/segments.module';
import { CustomizationModule } from '@private/customization/customization.module';
import { environment } from '@environments/environment';
import { CustomizationOptions } from '@private/customization/options/customization-options';

@NgModule({
 declarations: [
   HomeComponent,
 ],
 imports: [
   CommonModule,
   PrivateRoutingModule,
   NgZorroAntdModule,
   FormsModule,
   SharedModule,
   SegmentsModule,
   CustomizationModule.forRoot(environment.customizationOptions ?
   new CustomizationOptions(environment.customizationOptions) : new CustomizationOptions())
 ]
})
export class PrivateModule {

}


Конфигурируемый модуль:
javascript
@NgModule({
 declarations: [CustomizableHeaderComponent, CustomizableFooterComponent],
 exports: [
   CustomizableHeaderComponent,
   CustomizableFooterComponent
 ],
 imports: [
   CommonModule,
   SharedModule,
   NzLayoutModule
 ]
})
export class CustomizationModule {
 static forRoot(options) : ModuleWithProviders {
   return {
     ngModule: CustomizationModule,
     providers: [
       { provide: CustomizationOptionsToken, useValue: options, multi: true }
     ]
   };
 }
}
источник

AP

Andrey Panasenko in Angular - русскоговорящее сообщество
или возможно есть какой-то альтернативный способ динамического конфигурирования?
источник

ZS

Z S in Angular - русскоговорящее сообщество
друзья знаю что все хоть один раз использовали материал дизайн․
что делать если на мобиле текст внутри <mat-hint>  станет 2 линия и дизайн взрывается․
источник

Вキ

Вертихвост キバ 🏡🦊... in Angular - русскоговорящее сообщество
Артур Чернуха
Хорошо, спасибо. Буду пока читать в области Injection Token (если правильно нагуглил) и Вашей идеи как таковой.
Если будут вопросы, пишите, постарался комментариями передать зачем это все необходимо

// Возвращает только публичные свойства и методы
type WrapInterface<T> = { [P in keyof T]: T[P] };

// Имплементируем абстрактный класс, который будем использовать и реализовывать. Это отвязывает полностью нас от реализации сервиса из библиотеки, и мы совершенно не зависим от его реализации. Ниже это будет видно по тому, что мы сервис получаем из библиотеки.
abstract class BaseLocaleService implements WrapInterface<BsLocaleService> {
 abstract get locale(): BehaviorSubject<string>;

 abstract get localeChange(): Observable<string>;

 abstract get currentLocale(): string;

 abstract use(locale: string): void;
}

// Cобственная реализация, которая будет делать то, что нам надо. При этом реализуя абстракцию и получая сервис через DI она никак не зависит от реализации внешнего сервиса. А значит, если реализация изменится, то у нас ничего не сломается.
@Injectable()
class MyLocaleService extends BaseLocaleService {
 constructor(private ls: BaseLocaleService) {
   super();
   // Ниже этой строки в конструкторе имплементируем логику для установки локали, которая нужна:
   // if (isPlatformBrowser(...))
   //   { ... }
 }

 // Ниже реализуем абстракцию, делегируя вызовы другому сервису
 get locale(): BehaviorSubject<string> {
   return this.ls.locale;
 }

 get localeChange(): Observable<string> {
   return this.ls.localeChange;
 }

 get currentLocale(): string {
   return this.ls.currentLocale;
 }

 use(locale: string): void {
   return this.ls.use(locale);
 }
}

// и в модуле
providers: [
 // провайдим базовый класс, и по-умолчанию в нем будет класс из библиотеки
 { provide: BaseLocaleService, useClass: BsLocaleService },
 // провайдим собственный класс
 { provide: BsLocaleService, useClass: MyLocaleService }
]
источник

S

Smooth Operator in Angular - русскоговорящее сообщество
Вертихвост キバ 🏡🦊
Если будут вопросы, пишите, постарался комментариями передать зачем это все необходимо

// Возвращает только публичные свойства и методы
type WrapInterface<T> = { [P in keyof T]: T[P] };

// Имплементируем абстрактный класс, который будем использовать и реализовывать. Это отвязывает полностью нас от реализации сервиса из библиотеки, и мы совершенно не зависим от его реализации. Ниже это будет видно по тому, что мы сервис получаем из библиотеки.
abstract class BaseLocaleService implements WrapInterface<BsLocaleService> {
 abstract get locale(): BehaviorSubject<string>;

 abstract get localeChange(): Observable<string>;

 abstract get currentLocale(): string;

 abstract use(locale: string): void;
}

// Cобственная реализация, которая будет делать то, что нам надо. При этом реализуя абстракцию и получая сервис через DI она никак не зависит от реализации внешнего сервиса. А значит, если реализация изменится, то у нас ничего не сломается.
@Injectable()
class MyLocaleService extends BaseLocaleService {
 constructor(private ls: BaseLocaleService) {
   super();
   // Ниже этой строки в конструкторе имплементируем логику для установки локали, которая нужна:
   // if (isPlatformBrowser(...))
   //   { ... }
 }

 // Ниже реализуем абстракцию, делегируя вызовы другому сервису
 get locale(): BehaviorSubject<string> {
   return this.ls.locale;
 }

 get localeChange(): Observable<string> {
   return this.ls.localeChange;
 }

 get currentLocale(): string {
   return this.ls.currentLocale;
 }

 use(locale: string): void {
   return this.ls.use(locale);
 }
}

// и в модуле
providers: [
 // провайдим базовый класс, и по-умолчанию в нем будет класс из библиотеки
 { provide: BaseLocaleService, useClass: BsLocaleService },
 // провайдим собственный класс
 { provide: BsLocaleService, useClass: MyLocaleService }
]
а можно от меня вопрос
источник

S

Smooth Operator in Angular - русскоговорящее сообщество
па че му
геттеры
источник

АЧ

Артур Чернуха... in Angular - русскоговорящее сообщество
Вертихвост キバ 🏡🦊
Если будут вопросы, пишите, постарался комментариями передать зачем это все необходимо

// Возвращает только публичные свойства и методы
type WrapInterface<T> = { [P in keyof T]: T[P] };

// Имплементируем абстрактный класс, который будем использовать и реализовывать. Это отвязывает полностью нас от реализации сервиса из библиотеки, и мы совершенно не зависим от его реализации. Ниже это будет видно по тому, что мы сервис получаем из библиотеки.
abstract class BaseLocaleService implements WrapInterface<BsLocaleService> {
 abstract get locale(): BehaviorSubject<string>;

 abstract get localeChange(): Observable<string>;

 abstract get currentLocale(): string;

 abstract use(locale: string): void;
}

// Cобственная реализация, которая будет делать то, что нам надо. При этом реализуя абстракцию и получая сервис через DI она никак не зависит от реализации внешнего сервиса. А значит, если реализация изменится, то у нас ничего не сломается.
@Injectable()
class MyLocaleService extends BaseLocaleService {
 constructor(private ls: BaseLocaleService) {
   super();
   // Ниже этой строки в конструкторе имплементируем логику для установки локали, которая нужна:
   // if (isPlatformBrowser(...))
   //   { ... }
 }

 // Ниже реализуем абстракцию, делегируя вызовы другому сервису
 get locale(): BehaviorSubject<string> {
   return this.ls.locale;
 }

 get localeChange(): Observable<string> {
   return this.ls.localeChange;
 }

 get currentLocale(): string {
   return this.ls.currentLocale;
 }

 use(locale: string): void {
   return this.ls.use(locale);
 }
}

// и в модуле
providers: [
 // провайдим базовый класс, и по-умолчанию в нем будет класс из библиотеки
 { provide: BaseLocaleService, useClass: BsLocaleService },
 // провайдим собственный класс
 { provide: BsLocaleService, useClass: MyLocaleService }
]
Спасибо за пример с объяснениями. Всё очень хорошо расписано, но в моём случае это не совсем подошло, т.к. по видимому инстанция создаётся единожды, а мне эту логику нужно выполнять каждый раз, как создаётся компонент.  Даже, если я в компоненте это передам как провайдер, то он выполнится намного позже, чем нужно. Мне же критически важно, что бы эта логика выполнялась до отрисовки.
источник

S

Smooth Operator in Angular - русскоговорящее сообщество
Артур Чернуха
Спасибо за пример с объяснениями. Всё очень хорошо расписано, но в моём случае это не совсем подошло, т.к. по видимому инстанция создаётся единожды, а мне эту логику нужно выполнять каждый раз, как создаётся компонент.  Даже, если я в компоненте это передам как провайдер, то он выполнится намного позже, чем нужно. Мне же критически важно, что бы эта логика выполнялась до отрисовки.
почему это критически важно?
источник

S

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

S

Smooth Operator in Angular - русскоговорящее сообщество
похоже на костыль какой то
источник

YK

Yuri Katkov in Angular - русскоговорящее сообщество
в каких случаях ngOnChanges нельзя заменить на сеттеры @Input’ов?
источник

S

Smooth Operator in Angular - русскоговорящее сообщество
Yuri Katkov
в каких случаях ngOnChanges нельзя заменить на сеттеры @Input’ов?
ни в каких
источник

YK

Yuri Katkov in Angular - русскоговорящее сообщество
ngOnChanges же запускается при любом изменении любого инпута, верно? Получается, что заменив его на сеттеры, мы чуток ускорим приложение
источник

nt

nur tlek in Angular - русскоговорящее сообщество
Yuri Katkov
ngOnChanges же запускается при любом изменении любого инпута, верно? Получается, что заменив его на сеттеры, мы чуток ускорим приложение
не думаю
источник

SK

Sergey Khrolenok in Angular - русскоговорящее сообщество
Yuri Katkov
ngOnChanges же запускается при любом изменении любого инпута, верно? Получается, что заменив его на сеттеры, мы чуток ускорим приложение
про какое ускорение речь ?
источник