0

我有这样的形式:

business-validation是一个自定义的指令,其代码为:

var CREDIT_CARD_REGEX = /^\d{0,24}$/; 
angular.module('directives').directive('creditCard', [ 
    function() { 
     return { 
      restrict: 'A', 
      require: 'ngModel', 
      link: function (scope, element, attrs, ctrl) { 
       scope.$watch(attrs.creditCard, function (newValue) { 
        return ctrl.$setViewValue(ctrl.$viewValue); 
       }); 
       return ctrl.$parsers.push(function (viewValue) { 
        var newValue; 
        newValue = ctrl.$modelValue; 

        element.validateCreditCard(function (result) { 
         if (result.card_type && 
           result.luhn_valid && 
           result.length_valid && 
           CREDIT_CARD_REGEX.test(element.val())) { 
          element.attr("data-card-type", result.card_type.name); 
          ctrl.$setValidity('creditCard', true); 
          newValue = viewValue; 
         } 
         else { 
          element.removeAttr("data-card-type"); 
          ctrl.$setValidity('creditCard', false); 
         } 
        }, { accept: ['visa', 'mastercard'] }); 

        return newValue; 
       }); 
      } 
     }; 
    }]); 

我需要的myForm.anInputName.$error.creditCard值在控制器,并为此我做了this attempts和也类似于:

<input type="hidden" ng-model="IsCreditCardValid" name="IsCreditCardValid" value="myForm.anInputName.$error.creditCard" /> 

$scope.$watch("IsCreditCardValid", function (newValue, oldValue) { 
    alert('theChangeHasBeen:' + oldValue + ' -> ' + newValue); 
}); 

为了$watchIsCreditCardValid在控制器。

这一段显示:

<p class="help-block" ng-if="smyForm.anInputName.$error.creditCard && !myForm.anInputName.$error.required">Wrong credit card number!</p> 

,但隐藏的输入永远不会尽管使用相同的条件下的预期值。为什么最后一个隐藏字段没有更新,并且从未触发过$watch

编辑
如果我做

myForm.anInputName.$valid: {{myForm.anInputName.$valid}}
值更新在屏幕上,但隐藏字段不会改变它的值。

+1

建议你创建一个简单的演示(一个不需要信用卡号码) – charlietfl

+0

@charlietfl我有急事目前我...但我会尽正如你刚才所说... – JPCF

+0

@charlietfl我添加了一个编辑,给你任何提示? – JPCF

回答

0

ngModel仅适用于listed input types,隐藏不在其中。 input指令的内部做一个暗示,它不会在所有可能的输入自动工作:

var inputType = { 

    ... 

    'hidden': noop, 
    'button': noop, 
    'submit': noop, 
    'reset': noop, 
    'file': noop 
} 

这是有道理的,因为隐藏的投入并不需要双向绑定(它们在角应用不必要,太)。如果你一定要使用它们,然后

<input type="hidden" name="IsCreditCardValid" value="{{ IsCreditCardValid }}" /> 
+0

我试过[that](http://stackoverflow.com/questions/29479977/why-is-this-hidden-field-not-updated-when-watch-is-used-on-the-controller?noredirect = 1#comment47121975_29479977)但它不起作用... – JPCF

+0

我想你除了主题还有问题,并且当你发布单行代码而没有进一步的上下文时,他们似乎不可解决。 – estus

相关问题