【问题标题】:ng-model not updating when value changesng-model 在值更改时不更新
【发布时间】:2023-03-26 08:09:01
【问题描述】:

目前我有两个日期输入。我正在尝试将第二个日期输入默认为第一个日期输入。然后,用户可以将第二个日期输入更改为不同的值(保持第一个不变)。

当我更改我的第一个日期时,第二个日期输入更新正常,但是,ng-model 没有对form_data.to_date 属性的值更改进行建模,因此即使两者都导致表单仍然无效必填字段已填写。

这是一个问题的例子:

angular.module('myApp', [])
  .controller('myController', function($scope) {
    $scope.form_data = {
      from_date: '',
      to_date: ''
    };
    
    $scope.f = function() {
      setTimeout(function() { // delay to show that to_date is not updating
        console.log($scope.form_data);
      }, 1000);
    }
  });

angular.element(document).ready(() => {angular.bootstrap(document, ['myApp']);});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<div ng-controller="myController">
  
  <form name="myForm">
    <input type="date" 
           ng-model="form_data.from_date"
           name="from_date"
           ng-change="f()"
           required />
           
    <input type="date" 
           ng-model="form_data.to_date" 
           name="to_date"
           ng-value="form_data.to_date || form_data.from_date | date: 'yyyy-MM-dd'"
           required />
           
    <p>Form invalid: {{myForm.$invalid}}</p> <!-- Should be false when first date is changed -->
  </form>
</div>

value 在第一个输入中更改时,如何在第二个日期输入中获取ng-model 以模拟其更改?

【问题讨论】:

    标签: javascript angularjs forms angularjs-ng-model


    【解决方案1】:

    这是因为您正在使用ng-value="form_data.to_date || form_data.from_date | date: 'yyyy-MM-dd'" 即如果form_data.to_date 存在则分配它,如果不存在则分配form_data.from_date它不会更新ng-model 的值

    为此,您可以像这样修改您的代码:

        angular.module('myApp', [])
         .controller('myController', function ($scope) {
            $scope.form_data = {
              from_date: '',
              to_date: ''
            };
            $scope.f = function () {
              setTimeout(function () { // delay to show that to_date is not updating
                if ($scope.form_data.to_date == "") {
                  $scope.form_data.to_date = $scope.form_data.from_date;
                }
                console.log($scope.form_data);
                $scope.$apply();
              })
            }
        });
        angular.element(document).ready(() => { angular.bootstrap(document, ['myApp']); });   
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
    <div ng-controller="myController">
        <form name="myForm">
            <input type="date" ng-model="form_data.from_date" name="from_date" ng-change="f()" required />
            <input type="date" ng-model="form_data.to_date" name="to_date"
                ng-value="form_data.from_date | date: 'yyyy-MM-dd'" required />
            <p>Form invalid: {{myForm.$invalid}}</p> <!-- Should be false when first date is changed -->
        </form>
    </div>

    【讨论】: