AngularJS:自动检测模型的变化
AngularJS : automatically detect change in model
假设我想做一些事情,比如在模型的值发生变化时自动运行一些代码(比如将数据保存到服务器)。唯一的方法是通过在每个可能改变模型的控件上设置ng-change
之类的东西来做到这一点吗?
也就是说,有了视图,事情就会随着模型的改变而改变,而不必显式地连接任何东西。是否有类似于能够运行保存到服务器的代码?就像
myModel.on('change', function() {
$.post("/my-url", ...);
});
就像你可能看到的backbone
在带有{{}}
和/或ng-model的视图中,Angular会在幕后为你设置$watch()
。
默认$watch
通过引用进行比较。如果你把第三个参数设置为$watch
到true
, Angular会"浅层"观察对象的变化。对于数组,这意味着比较数组项,对于对象映射,这意味着观察属性。所以这应该是你想要的:
$scope.$watch('myModel', function() { ... }, true);
更新: Angular v1.2为此添加了一个新方法,' $watchCollection():
$scope.$watchCollection('myModel', function() { ... });
注意,"浅"这个词是用来描述比较的,而不是"深",因为引用不跟随——例如,如果被观察的对象包含一个属性值,该属性值是对另一个对象的引用,则不跟随该引用来比较另一个对象。
如果你需要样式你的表单元素根据它的状态(修改/未修改)动态或测试是否有一些值实际上已经改变,你可以使用以下模块,由我自己开发:https://github.com/betsol/angular-input-modified
它为表单及其子元素添加了额外的属性和方法。使用它,您可以测试某些元素是否包含新数据,甚至测试整个表单是否有新的未保存的数据。
你可以设置以下监视:$scope.$watch('myForm.modified', handler)
和你的处理程序将被调用,如果某些表单元素实际上包含新的数据或如果它反转到初始状态。
另外,您可以使用单个表单元素的modified
属性来实际减少通过AJAX调用发送到服务器的数据量。没有必要发送未修改的数据。
reset()
方法将表单恢复到初始状态。
你可以在这里找到模块的演示:http://plnkr.co/edit/g2MDXv81OOBuGo6ORvdt?p=preview
干杯!
检测单个模型中的更改
$scope.$watchCollection('model1', function () {
//...
}, true);
检测多个模型中的变更
$scope.$watchCollection('[model1, model2, model3]', function () {
//...
}, true);
- AngularJS视图没有'当ng模型值发生变化时,t更新
- 当$scope模型发生变化时,角度视图不会发生变化
- 淘汰教程神秘变化视图模型
- 当模型更改时,AngularJS图像SRC会发生变化
- 用ng变化更新角度模型
- 当ng模型在文本字段中发生变化时,使用AngularJS对标签进行样式设置
- AngularJS没有'当模型发生变化时,不要更新img src
- 当其中一个模型发生变化时,我如何在Backbone.js中为集合视图附加事件处理程序?
- 骨干模型触发“变化”.两次事件
- 在AngularJS中有没有一种方法可以在不使用$watch的情况下对模型变化做出反应?
- Angular JS, Typescript -当使用$watch时,UI不会显示模型的变化
- 模型'变化'但它'不是
- 我如何从我的自定义指令响应模型的变化
- 如何在反应中对模型变化进行渐变,或者在哪里解决冲突以实现流畅的纯渲染
- Angular对模型的变化做出反应
- AngularJS:自动检测模型的变化
- 如果路由或模型发生变化,则稍后取消ember .run. js
- Durandal构成有界视图模型的一个变量的变化值
- 将ng模型属性绑定到不断变化的对象值如何更新ng模型
- 角度变化是't保存到模型中