有没有一种方法可以在模型本身上检查脏标志,而不依赖于视图?
我需要让angular控制器知道哪些属性已经被更改,以便仅将更改的变量保存到服务器。
我已经实现了关于整个表单是否脏或原始的逻辑,但这还不够具体。
我可以在每个输入上添加名称和ng-form属性,以使其在控制器中可识别为表单,但那样我就会得到一个与视图强耦合的控制器。
另一种不太吸引人的方法是将每个输入绑定到单独的对象中存储初始值,然后将当前值与初始值进行比较以确定它们是否已更改。
有没有一种方法可以在模型本身上检查脏标志,而不依赖于视图?
我需要让angular控制器知道哪些属性已经被更改,以便仅将更改的变量保存到服务器。
我已经实现了关于整个表单是否脏或原始的逻辑,但这还不够具体。
我可以在每个输入上添加名称和ng-form属性,以使其在控制器中可识别为表单,但那样我就会得到一个与视图强耦合的控制器。
另一种不太吸引人的方法是将每个输入绑定到单独的对象中存储初始值,然后将当前值与初始值进行比较以确定它们是否已更改。
我能想到的一个选择是
As you get a model/object from service, create a replica of the model within the model and bind this new model to your view.
Add a watch on the new Model and as the model changes, use the replica to compare old and new models as follows
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]
}
}
}
}
}
$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