Typescript NgModel subscribe仅在angular2中更改实际textarea时触发

Typescript NgModel subscribe仅在angular2中更改实际textarea时触发,typescript,angular,Typescript,Angular,我有下面的代码。基本上,它是一个带有指令的组件,该指令订阅textarea的模型 如果我在textarea中键入,subscribe会触发,控制台日志也会更改,但是如果模型在外部更改,并且从组件中的@Input接收到,则即使textarea中的文本正在更新,也不会触发textarea中的subscribe 为什么在文本更改时不触发 @指令({ 选择器:“textarea[mydir]”, 主机:{'ngFormControl':'myCtrl'} }) 类MyDirective{ myCtrl:

我有下面的代码。基本上,它是一个带有指令的组件,该指令订阅textarea的模型

如果我在textarea中键入,subscribe会触发,控制台日志也会更改,但是如果模型在外部更改,并且从组件中的@Input接收到,则即使textarea中的文本正在更新,也不会触发textarea中的subscribe

为什么在文本更改时不触发

@指令({
选择器:“textarea[mydir]”,
主机:{'ngFormControl':'myCtrl'}
})
类MyDirective{
myCtrl:any;
构造函数(){
this.myCtrl=新控件();
this.myCtrl.valueChanges.subscribe(
(数据)=>{
console.log('模型更改',数据);
});
}
}
//项目卡
@组成部分({
选择器:“四”,
提供者:[],
样式:[require('./four.scss')],
指令:[NgFor,MyDirective],
模板:`
你好,正在工作!
`, }) 出口四级{ @Input()pp:Array; 构造函数(){ } }
事实上,这是正确的行为。事实上,视图更新时,
update
自定义事件(参见源代码中的这一行)触发
NgModel
指令:

viewtomodeupdate(newValue:any):无效{
this.viewModel=newValue;
ObservableWrapper.callEmit(this.update,newValue);
}
您应该使用表单控件来实现此类处理:

@组件({
选择器:“四”,
指令:[MyDirective],
模板:`
你好,正在工作!
`, }) 出口四级{ @输入()pp; 构造函数(){ this.myCtrl=新控件(); this.myCtrl.valueChanges.subscribe( (数据)=>{ console.log('Model change'); }); } }
请参阅以下链接:

编辑

要实现预期效果,需要利用与
ngModel
关联的控件,并在其
valueChanges
属性中订阅。这样,当模型中的值更新时,以及从文本区域更新时,都会通知您:

@指令({
选择器:“textarea[mydir]”,
})
类MyDirective{
构造函数(@Optional()公共模型:NgModel){
this.model.control.valueChanges.subscribe(数据=>{
log('值更新-新值='+数据);
});
}
}

我更新了我的plunkr:。

@b hull,如果您想要答案,添加codeden或JSFIDLE可能会有所帮助。我已编辑了上面的问题以使用您的答案,但它似乎不起作用,你能看一下吗。如果我添加括号,我会得到以下错误:模板解析错误:无法绑定到“ngFormControl”,因为它不是已知的本机property@BHull我终于找到了解决办法。您必须依赖与
ngModel
隐式关联的控件,并订阅其
valueChanges
属性。希望它能解决您的问题;-)