[ng-model值更改时不更新

问题描述 投票:0回答:1

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

当我更改我的第一个日期时,第二个日期输入更新得很好,但是,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>

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

javascript angularjs forms angularjs-ng-model
1个回答
0
投票

这是因为您已经分配了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>
© www.soinside.com 2019 - 2024. All rights reserved.