【问题标题】:Check in controller which input element has been modified检查控制器哪个输入元素已被修改
【发布时间】:2017-08-22 09:51:10
【问题描述】:

我需要检查更新表单中哪个输入元素已被修改。

    <form name="utilizationForm" role="form" novalidate>
    <div class="row" data-ng-repeat="i in [1,2,3,4]">
            <div class="col-md-3"> 
                <div asterick class="form-group" ng-class="{'form-group has-success': !error['resource_type'] && (submitted), 'form-group has-error': (error['resource_type']) && (submitted)}"> 
                    <label for="resourceType">Resource Type</label>
                    <input type="hidden" name="id" id="id" class="form-control" ng-model="data['id' + i]" value="">
                                        <select name="resourceType" id="resourceType" ng-model="data['resource_type' + i]" class="form-control" ng-required="true"  >
                                            <option ng-repeat="option in resourceTypeJson" value="{{option}}">{{option}}</option>
                                        </select>
                    <span class="er-block" ng-show="utilizationForm.resourceType.$touched && utilizationForm.resourceType.$error.required">Please provide Resource type.</span>
                    <span ng-show="error.resource_type1" class="er-block">{{error.resource_type1}}</span>
                </div>    
            </div>
            <div class="col-md-3">
                <label for="efforts">Efforts (in hours)</label>
                <input type="hidden" name="id" id="id" class="form-control" ng-model="data['id' + i]" value="">
                <input type="text"  test-change name="efforts" id="efforts" class="form-control" ng-model="data['efforts' + i]"  value="">
            </div>
        </div>
        <div class="text-right" ng-class="{'col-md-6 mt25': showCompletion}">
            <button class="btn btn-primary" ng-disabled="utilizationForm.$invalid" ng-click="addUtilizationReport()">{{buttonText}}</button>
        </div>

    </form>

现在,当我单击更新按钮时,我需要检查在控制器的更新表单中修改了哪个输入元素。请帮忙。

【问题讨论】:

  • 您可以通过 $watch 进行检查
  • 如何在控制器中使用它。我对角度不太了解

标签: angularjs input updatemodel angularjs-forms


【解决方案1】:

如果你把输入放在一个带有name属性的表单中,然后给输入一个name属性,你也可以访问输入的$dirty属性。

<div ng-controller="MyController">
  <form name="myForm">
    <input type="text" name="first" ng-model="firstName">
    <input type="text" name="last" ng-model="lastName">
  </form>
</div>
app.controller('MyController', function($scope) {
  // Here you have access to the inputs' `$dirty` property
  console.log($scope.myForm.first.$dirty);
  console.log($scope.myForm.last.$dirty);
});

您可以使用$scope.myForm.$dirty 查看是否有任何字段已更改,并使用表单上每个输入属性上的$dirty 属性查看该输入是否已更改。您甚至可以遍历 myForm 对象(非输入字段对象的键以 $ 为前缀):

angular.forEach($scope.myForm, function(value, key) {
  if(key[0] == '$') return;
  console.log(key, value.$dirty)
});

【讨论】:

  • 即使我没有更改日期输入,您的示例总是在日期字段上返回 true,我使用的是具有文本输入的日期选择器
  • 可能是模型变量的初始值在页面渲染后更新的情况。这是 angular 本身给出的标准方式。有关更多详细信息,您可以参考此链接docs.angularjs.org/api/ng/type/form.FormController
  • 感谢@Dhiraj 的支持。它真的帮助我克服了我的问题。
  • 不客气。我在我的项目中也遇到了同样的问题。继续努力和学习。
  • 欲了解更多信息,请参阅AmgularJS Developer Guide - Forms
【解决方案2】:

这是在控制器中使用 $watch 的最简单示例:

var app = angular.module('myApp', []);
app.controller('appCtrl', function($scope, $location) {
    $scope.$watch('abc', function(newVal,oldVal) {
      if(oldVal != newVal){
        alert("value changed!");
      }    
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div ng-app="myApp" ng-controller="appCtrl">
 <input type="text" name="first" ng-model="abc">
</div>

【讨论】:

  • 这可以是其他方法,我投了赞成票,但这是为了观察范围变量的变化。如果您查看他的问题,他只需要从表单中获取脏字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
相关资源
最近更新 更多