AngularJS:检查模型值是否已更改
AngularJS : check if a model value has changed
有没有办法检查模型本身的脏标志,独立于视图?
我需要角度控制器知道哪些属性已更改,以便仅将更改的变量保存到服务器。
我已经实现了关于我的整个表单是脏的还是原始的逻辑,但这还不够具体
我可以在每个输入上打一个名称和 ng-form 属性,使其可识别为控制器中的表单,但最终我得到一个与视图强耦合的控制器。
另一种不太吸引人的方法是将每个输入绑定到的初始值存储在一个单独的对象中,然后将当前值与初始值进行比较以了解它们是否已更改。
我检查了原始/脏表单状态和 AngularJS 的监控特定字段:$pristine用于 ng-check 检查输入
我能想到的一个选择是
-
从服务获取模型/对象时,请在模型中创建模型的副本,并将此新模型绑定到视图。
-
在新模型上添加监视,当模型更改时,使用副本比较新旧模型,如下所示
var myModel = { property1: "Property1", property2: "Property2", array1:["1","2","3"] } var getModel = function(myModel){ var oldData = {}; for(var prop in myModel){ oldData.prop = myModel[prop]; } myModel.oldData = oldData; return myModel; } var getPropChanged = function(myModel){ var oldData = myModel.oldData; for(var prop in myModel){ if(prop !== "oldData"){ if(myModel[prop] !== oldData[prop]){ return{ propChanged: prop, oldValue:oldData[prop], newValue:myModel[prop] } } } } }
您可能会发现存储和稍后与对象的 JSON 表示形式进行比较最容易,而不是遍历各种属性。
请参阅使用 angularjs 检测未保存的数据。
下面
显示的类可能非常适合您的目的,并且可以轻松地跨页面重用。
加载模型时,请记住其原始值:
$scope.originalValues = new OriginalValues();
// Set the model and remember it's value
$scope.someobject = ...
var key = 'type-' + $scope.someobject.some_unique_key;
$scope.originalValues.remember(key, $scope.someobject);
稍后,您可以使用以下命令确定是否需要保存它:
var key = 'type-' + $scope.someobject.some_unique_key;
if ($scope.originalValues.changed(key, $scope.someobject)) {
// Save someobject
...
}
该键允许您记住多个模型的原始值。如果您只有一个ng-model,则键可以简单地是"model"或任何其他字符串。
假设在查找更改时应忽略以"$"或"_"开头的属性,并且 UI 不会添加新属性。
下面是类定义:
function OriginalValues() {
var hashtable = [ ]; // name -> json
return {
// Remember an object returned by the API
remember: function(key, object) {
// Create a clone, without system properties.
var newobj = { };
for (var property in object) {
if (object.hasOwnProperty(property) && !property.startsWith('_') && !property.startsWith('$')) {
newobj[property] = object[property];
}
}
hashtable[key] = newobj;
},// remember
// See if this object matches the original
changed: function(key, object) {
if (!object) {
return false; // Object does not exist
}
var original = hashtable[key];
if (!original) {
return true; // New object
}
// Compare against the original
for (var property in original) {
var changed = false;
if (object[property] !== original[property]) {
return true; // Property has changed
}
}
return false;
}// changed
}; // returned object
} // OriginalValues
相关文章:
- 主干-不管怎样,检查事件以前是否绑定过
- 如何让程序检查所选单词中是否有按键
- 用于检查数组中是否存在元素的javascript自定义方法
- 使用 jQuery 检查所有值是否为空或已填充
- 如何检查元素的内容是否为空,如果为空,请在jquery中删除该元素
- 使用map来检查是否为真'不起作用
- 遍历 JSON 对象并检查 URL 是否以某个值结尾
- 使用onkeyup JS事件检查输入的值是否唯一
- JS数组-检查对象值是否重复
- PhantomJS - 检查javascript函数是否正在运行的任何方法
- 如何使用jQuery可编辑插件检查ajax是否成功完成
- 如何在AngularJS中有效地检查日期是否有效
- 如何检查数组中的对象是否等于选项值
- 检查是否存在使用chrome扩展的javascript库
- 当一些文本粘贴到文本框中时(没有设置超时),是否检查数字
- 如何检查是否检查了分区中的所有单选按钮
- 验证是否检查了1到3个复选框,但id不同
- JavaScript 的类型函数是否检查空值
- 如何知道angularjs中的控制器中是否检查了单选按钮
- 在垃圾收集期间是否检查持久收集