Angular2 指令监听 parent 组件回调或更改

Angular2 directive listen to parent component callbacks or changes

我有一个 angular2/4 指令,我附加到输入 DOM 元素,它向它们添加了一个 class ,标记它们不为空。

@Directive({
    selector: '[inputNotEmptyAddClass]'
})
export class InputNotEmptyDirective implements OnInit {
...
@HostListener('change') onChange() {
        this.process();
    }
...
process() {
[Add class to parent input element, when it has a value]
}

一切正常,直到我在节目中引入了日期选择器模块 (https://github.com/kekeh/mydatepicker)。此模块创建一个新组件,其中 children 之一是输入,整个组件让我选择一个日期。

我想在这里实现的目标:

我想重写我的指令以监听日期选择器的回调或订阅(我正在使用 RXjS)一些日期选择器变量。但是我不知道如何正确地实现它。

我尝试了什么?

我发现使用 ControlValueAccessor

constructor( @Inject(NG_VALUE_ACCESSOR) private _valueAccessor: ControlValueAccessor )

我可以检查一下,我的指令挂钩的元素是否是日期选择器。

if ( this._valueAccessor[0].constructor.name == 'MyDatePicker' ) {

现在我可以看到它有 onChange 函数和所有变量,但我不知道如何订阅它们。

我也可以在我的指令中使用模块回调函数,但它们似乎没有被触发。有什么方法可以触发它们吗?

onDateChanged(event: IMyDateModel) {
        // event properties are: event.date, event.jsdate, event.formatted and event.epoc
    }

底线。

我愿意接受有关如何将指令挂接到 parent 元素变量和回调的任何线索或解决方案。我知道这是一个非常笼统的问题,但也许有人可以在这里为我指明正确的方向。

您可以收听输入发送的事件。在日期的情况下是 dateChanged ,在常规输入的情况下是 change

没有指令你可以直接说

<input type="text" (change)="doSomething()" />

// (dateChanged)="doSomething()" in case of date 

如果你在指令中有它,你可以添加 HostListener 到它。

@HostListener('dateChanged') dateChange() {
     //  do something  
}