在Angular中,我可能有一个看起来像这样的表单:
在相应的控制器中,我可以轻松地观察对该表单内容的更改,如下所示:
function($scope) { $scope.model = {}; $scope.$watch('model', () => { // Model has updated }, true); }
这是JSFiddle上的一个Angular示例.
我无法弄清楚如何在Angular中完成同样的事情.显然,我们不再拥有$scope
$ rootScope.当然有一种方法可以实现同样的目的吗?
这是一个关于Plunker的Angular示例.
UPD.更新答案和演示以与最新的Angular保持一致.
您可以订阅整个表单更改,因为表示表单的FormGroup提供了一个ObservrablevalueChanges
实例的属性:
this.form.valueChanges.subscribe(data => console.log('Form changes', data));
在这种情况下,您需要使用FormBuilder手动构造表单.像这样的东西:
export class App {
constructor(private formBuilder: FormBuilder) {
this.form = formBuilder.group({
firstName: 'Thomas',
lastName: 'Mann'
})
this.form.valueChanges.subscribe(data => {
console.log('Form changes', data)
this.output = data
})
}
}
查看valueChanges
此演示中的操作:http://plnkr.co/edit/xOz5xaQyMlRzSrgtt7Wn?p = preview
如果您正在使用FormBuilder
,请参阅@ dfsq的答案.
如果您不使用FormBuilder
,有两种方法可以通知更改.
方法1
正如对问题的评论中所讨论的,在每个输入元素上使用事件绑定.添加到您的模板:
然后在你的组件中:
doSomething(newValue) { model.first_name = newValue; console.log(newValue) }
" 表单"页面提供了一些与此相关的ngModel的其他信息:
这
ngModelChange
不是元素事件.它实际上是
NgModel
指令的事件属性.当Angular在表单中看到绑定目标时[(x)]
,它期望该x
指令具有x
输入属性和xChange
输出属性.另一个奇怪的是模板表达,
model.name = $event
.我们习惯于看到$event
来自DOM事件的对象.ngModelChange属性不会生成DOM事件; 它是一个AngularEventEmitter
属性,在它触发时返回输入框值.我们几乎总是喜欢
[(ngModel)]
.如果我们必须在事件处理中执行一些特殊操作(例如去抖动或限制击键),我们可能会拆分绑定.
在你的情况下,我想你想做一些特别的事情.
方法2
定义本地模板变量并将其设置为ngForm
.
在输入元素上使用ngControl.
使用@ViewChild获取对表单的NgForm指令的引用,然后订阅NgForm的ControlGroup以进行更改: