1

カスタム角度フォーム検証を使用して、値を持つフィールドとドロップダウンの選択された値に基づいてフィールドを検証しています。ページでコードの同じセクション (したがって同じディレクティブ) を 2 回使用しています。この再利用ができるように、ディレクティブに引数を送信してみました。これはすべて正常に機能しています。ただし、子スコープが作成されると、双方向バインディングが壊れてfruit.cost.

ここにフィドルの例があります。

私は何を間違っていますか?すべての検証が同じように機能するだけでなく、双方向バインディングも保持したい。ここに私のフィドルコードのコピーがあります:

JS

function MainCtrl($scope){
  $scope.localFruits = [
      {name: 'banana'},
      {name: 'orange'},
      {name: 'grape'}
  ];
  $scope.fruits = [
      {name: 'banana'},
      {name: 'orange'},
      {name: 'grape'}
  ];
  $scope.costRequired = [
      'local',
      'overseas'
  ];
  $scope.selectedCostRequired = '';
}

angular.module('test', []).directive('customRequired', function() {
  return {
      restrict: 'A',
      require: 'ngModel',
      scope: {
          requiredWhenKey: '=',
          cost: '=' // I think the problem is here?? Can't figure out how to pass the property I want to bind to
      },
      link: function(scope, elem, attrs, ctrl) {
          //console.log(scope);
          function isValid(value) {
              if (scope.$parent.selectedCostRequired === scope.requiredWhenKey) {
                  return !!value;
              }
              return true;
          }

          ctrl.$parsers.unshift(function(value) {
              var valid = isValid(value);
              scope.$parent.subForm.cost.$setValidity('customRequired', valid);
              return valid ? value : undefined;
          });

          ctrl.$formatters.unshift(function(value) {
              scope.$parent.subForm.cost.$setValidity('customRequired', isValid(value));
              return value;
          });

          scope.$watch('$parent.$parent.selectedCostRequired', function() {
              scope.$parent.subForm.cost.$setValidity('customRequired', isValid(ctrl.$modelValue));
          });
      }
  };
});

HTML

<div ng-app="test" ng-controller="MainCtrl">
<form name="form">
    Which grouping is required? <select name="costRequired" ng-model="selectedCostRequired" ng-options="t for t in costRequired"></select>
    <h2>Local</h2>
    <div ng-repeat="fruit in localFruits" ng-form="subForm">
        {{fruit.name}}: <input name="cost" ng-model="fruit.cost" required-when-key="'local'" custom-required/> bound value is: [{{fruit.cost}}]
        <span class="error" ng-show="subForm.cost.$error.customRequired">Required</span>
    </div>
    <h2>Overseas</h2>
    <div ng-repeat="fruit in fruits" ng-form="subForm">
        {{fruit.name}}: <input name="cost" ng-model="fruit.cost" required-when-key="'overseas'" custom-required/> bound value is: [{{fruit.cost}}]
        <span class="error" ng-show="subForm.cost.$error.customRequired">Required</span>
    </div>
    <div ng-show="form.$invalid" class="error">some form error(s) still exist</div>
    <div ng-show="!form.$invalid" class="okay">form looks good!</div>
</form>
</div>
4

1 に答える 1