AngularJS:检查模型值是否已更改

时间:2014-11-18 17:30:16

标签: javascript angularjs

有没有办法检查模型本身的脏标志,与视图无关?

我需要角度控制器来知道哪些属性已被更改,以便仅将更改的变量保存到服务器。

我已经实现了关于我的整个表单是脏还是原始的逻辑,但这不够具体

我可以在每个输入上打一个名字和ng-form属性,使其在控制器中被识别为一个表单,但最后我得到一个与视图强烈耦合的控制器。

另一个不太吸引人的方法是将每个输入绑定的初始值存储在单独的对象中,然后将当前值与初始值进行比较,以了解它们是否已更改。

我查看了Monitor specific fields for pristine/dirty form stateAngularJS : $pristine for ng-check checked inputs

3 个答案:

答案 0 :(得分:2)

我能想到的一个选择是

  1. 当您从服务中获取模型/对象时,请在模型中创建模型的副本,并将此新模型绑定到您的视图。

  2. 在新模型上添加监视,随着模型的更改,使用副本比较新旧模型,如下所示

    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]
            }
          }
        }
      }
    }
    

答案 1 :(得分:0)

您可能会发现最容易存储并稍后与对象的JSON表示进行比较,而不是循环遍历各种属性。

请参阅Detect unsaved data using angularjs

答案 2 :(得分:0)

下面显示的类可能适用于您的目的,并且可以在页面之间轻松重复使用。

在您加载模型时,您会记住它们的原始值:

    $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