Почему директива из общего модуля не определена?

Я использую в приложении angular 7 общий модуль для использования директивы в разных других модулях.

import { Directive, OnInit, HostBinding, Input } from '@angular/core';

@Directive({
    selector: '[appServerSuccess]'
})

export class ServerSuccessDirective implements OnInit {
    @Input() appServerSuccess: string;
    @HostBinding()
    get innerText() {
       return this.appServerSuccess;
    }
    @HostBinding('class.success')
    get success () {
       return this.appServerSuccess.toLocaleLowerCase().includes('success');
    }

    constructor() {}
    ngOnInit() {}
}

В shared.module.ts у меня есть декларация и экспорт директивы:

import { NgModule } from "@angular/core";
import { ServerSuccessDirective } from './directives/server-success.directive';


@NgModule({
    imports: [ ],
    declarations: [ ServerSuccessDirective ],
    exports: [ ServerSuccessDirective ]
})

export class SharedModule {}

В каждом из app.module.ts и user.module.ts у меня есть импорт SharedModule.

Директива используется в разных компонентах приложения.

<div [appServerSuccess]="msg"></div>

msg передается через службу как:

private messageSource = new BehaviorSubject('');
currentMessage = this.messageSource.asObservable();

constructor() {
    changeMessage(msg: string) {
        this.messageSource.next( msg );
    }
}

в компонентах в app.module он работает нормально, но в другом компоненте в user.module выдает следующую ошибку:

Невозможно прочитать свойство toLocaleLowerCase из undefined

Это означает, что директива не распознается в user.module.

импорт в модулях, объявление и экспорт в SharedModule верны. Где я ошибаюсь?

Я искал и нашел этот вопрос, который выглядит похожим , но в нем нет решения моей проблемы.


person k.vincent    schedule 21.02.2019    source источник
comment
это похоже на это. appServerSuccess не определен ... может быть, вы можете добавить инициализацию для msg var?   -  person federico scamuzzi    schedule 21.02.2019
comment
Если бы директива не была распознана, вы бы получили другую ошибку (что-то вроде Cannot bind to "appServerSuccess" since it isn't a known property of "div"). Это означает, что ваша ошибка заключается в том, что msg не определен в тот конкретный момент, когда осуществляется доступ к success ...   -  person miselking    schedule 21.02.2019
comment
@miselking: Это правда. Но это сообщение об ошибке внезапно было исправлено / исчезло.   -  person k.vincent    schedule 21.02.2019
comment
Переменная msg передается службой через BehaviorSubject. И я подаю в суд на это в ответе на HTTP-запрос. Я обновлю свой вопрос, чтобы убедиться, что добавляю всю необходимую информацию.   -  person k.vincent    schedule 21.02.2019


Ответы (2)


значение по умолчанию для инициализированного appServerSuccess равно undefined, поэтому присвойте ему значение перед передачей значения из родительского компонента.

изменить эту строку

 @Input() appServerSuccess: string;

к этой строке

 @Input() appServerSuccess: string = '';

или любой другой string по умолчанию.

здесь можно найти дополнительную информацию о typescript variables declarations

person Ganesh    schedule 21.02.2019
comment
Пробовал, но проблема не устранилась. - person k.vincent; 21.02.2019

Проблема исправлена. Он был в компоненте, который принадлежит user.module и использует / передает значение свойства msg для директивы.

Так, например, в компоненте user-update.component.ts у меня было свойство msg, которое не было инициализировано, например: msg: string. Я изменил это на: msg = '';

person k.vincent    schedule 21.02.2019