0

我有一个包含 100 个键值对的对象。

$scope.obj = {
  key1: value1,
  key1: value1,
  .
  .
  .
  key100: value100
}

我有 100 个输入

<form>
   <input value="obj.key1" ng-model="obj.key1" />
   <input value="obj.key2" ng-model="obj.key2" />
   <input value="obj.key3" ng-model="obj.key3" />
   .
   .
   .
   <input value="obj.key100" ng-model="obj.key100" />
   <button ng-click="submit> </button>
</form>

当我提交数据时,数据将发送到服务器。有时我会改变价值观,有时不会。如果我在一个输入中更改一个值,我希望它key,value来自对象。这样我就可以使用该数据发送服务器调用,而不是发送整个数据。

4

5 回答 5

1

我将通过使用默认ngForm指令$dirty和原始输入值的“保存状态”对象来实现这一点。这是实现您想要的简单解决方案。ngForm本身不提供原始值,因此您必须创建一个“保存对象”并手动比较它们。

看法

<div ng-controller="MyCtrl">
  <form name="myForm" ng-submit="submit()">
    <input type="text" name="key1" ng-model="obj.key1"><br />
    <input type="text" name="key2" ng-model="obj.key2"><br />
    <input type="text" name="key3" ng-model="obj.key3">
    <input type="submit" id="submit" value="Submit" />
  </form>
</div>

AngularJS 应用程序

var myApp = angular.module('myApp',[]);

myApp.controller('MyCtrl', function ($scope) {

    $scope.obj = {
      key1: 'test 1',
      key2: 'test 2',
      key3: 'test 3',
    }

    var originalValues = angular.copy($scope.obj);

    $scope.submit = function () {

      var paramsChanged = {};

      angular.forEach($scope.obj, function (value, key) {
          if ($scope.myForm[key].$dirty && originalValues[key] !== value) {
            paramsChanged[key] = value;
          }
      });

      console.log(paramsChanged);
    }
});

>演示小提琴

于 2018-03-16T10:35:52.650 回答
0

您可以使用$watch来观察$scope.

$scope.$watch('obj.key1', function(newValue, oldValue) {
  console.log('Key1 was updated from' + oldValue + ' to ' + newValue');
});
于 2018-03-16T10:15:28.160 回答
0

您可以使用ng-change来检测任何更改,以及 (key, value) 语法ng-repeat来列出您的输入。这是一个演示:

var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
  $scope.obj = {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
  }

  var toSend = [];
  $scope.select = function(key) {
    var s = {};
    s[key] = $scope.obj[key]
    toSend.push(s); // or just the value: $scope.obj[key]
  }

  $scope.submit = function() {
    console.log(toSend)
    $scope.sent = toSend;
  }

});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>

<div ng-app="myApp" ng-controller="myCtrl">

  <form ng-submit="submit()">
    <div ng-repeat="(key,value) in obj">
      <input ng-change="select(key)" ng-model="value" /><br>
    </div>
    <button type="submit">Send</button>
  </form>

  <pre>{{sent | json}}</pre>

</div>

于 2018-03-16T10:24:13.610 回答
0

拥有变量的副本,在将其发送到服务器之前,使用如下比较函数将模型对象与复制的变量进行比较:

// At the time of initialization
$scope.obj = [ ... ];
var copiedObj = angular.copy($scope.obj);

// At the time of submit
var changed = {};

Object.keys(copiedObj).forEach(key => {
  if(copiedObj[key] !== $scope.obj[key]) {
    changed[key] = $scope.obj[key];
  }
});

// Submit `changed` to the server

假设copiedObj是 original 的副本$scope.objchanged将包含实际更改的键。这样就可以发送changed到服务器了。

于 2018-03-16T10:13:40.273 回答
0

您可以通过这种方式将 ng-change 绑定到您的 HTML,并且每当特定元素发生 ng-change 时,编写代码以推送到数组并将该数组发送到服务器。示例代码

    <input value="obj.key100" ng-model="obj.key100" ng-change="selectedValue(obj.keyx)" />

角码

 $scope.tempValues=[];
 $scope.selectedValue = function(x) {
    $scope.tempValues.push(x);
 }
于 2018-03-16T10:19:43.527 回答