验证器中的函数,而不是控制器给我一个未定义的“lowerCase()”

Posted

技术标签:

【中文标题】验证器中的函数,而不是控制器给我一个未定义的“lowerCase()”【英文标题】:Function in validator, not controller giving me an undefined at 'lowerCase()' 【发布时间】:2016-12-14 10:45:10 【问题描述】:

我有一个表单,我试图确保不区分大小写不是电子邮件验证的问题。我有一个名为mustMatch 的角度验证,它可以按照它的说明进行操作,它确保电子邮件与索引匹配。但是,我还需要确保这种情况不是问题。所以我最终创建了一个名为matchCaseInsensitivity 的辅助函数,最终这就是我遇到问题的地方,因为我认为解决这个问题的最佳方法是添加tolowerCase() 过滤器。当我这样做时,我能够绕过我的 angular mustMatch 错误消息(这很好),但是当我在表单上提交时,我会在 'tolowerCase()' is undefined 中遇到一个 javascript 问题。

我认为我收到此错误的原因是因为我将这些内置在验证器文件中,而不是控制器中。 (不知道是不是这样)

我的前端看起来像这样。请注意 'match-case-insensitive' => true 作为我的解决方案构建

      %input-md type: "email", "ng-model" => "vm.form.email_confirmation", required: true, 'must-match' => 'register_form["vm-form-email"]', 'match-case-insensitive' => true, 'ng-hide' => 'vm.form.validated_email', autocapitalize: 'off' 
        Confirm email address

我的 mustMatch 验证错误消息是

if attr.mustMatch    then addValidation 'mustMatch',    'This field must match the previous value.'

触发 mustMatch 错误消息的实际函数,我也将它与我在前端引用的 'match-case-insensitive' 捆绑在一起。这也在验证文件中,而不是控制器中。 (因为那值多少钱……我不知道)。 (请注意,它在 coffeeScript 中)

getMatchValue = ->
      match = matchGetter($scope)
      if (angular.isObject(match) and match.hasOwnProperty('$viewValue'))
        match = match.$viewValue
      match

    $scope.$watch getMatchValue, ->
      ctrl.$$parseAndValidate()
      return

    ctrl.$validators.mustMatch = ->

      match = getMatchValue()
      if $attrs.matchCaseInsensitive
        ctrl.$viewValue.toLowerCase() is match.toLowerCase()
      else
        ctrl.$viewValue is match

    return

我继续收到这个TypeError: Cannot read property 'toLowerCase' of undefined at r.$validators.mustMatch。我已经坚持了2天多了,真的不知道如何解决它。如果有人能看看他们能做什么,我将不胜感激。

【问题讨论】:

【参考方案1】:

从错误中,很明显ctrl.$viewValuematch(或两者)都是undefined。不确定在这种情况下您希望预期的行为是什么,但这是一种可行的方法(我将用 JavaScript 编写):

match = getMatchValue()

if (!(match && ctrl.$viewValue)) 
    return false


if ($attrs.matchCaseInsensitive) 
    return ctrl.$viewValue.toLowerCase() === match.toLowerCase()


return ctrl.$viewValue === match

【讨论】:

以上是关于验证器中的函数,而不是控制器给我一个未定义的“lowerCase()”的主要内容,如果未能解决你的问题,请参考以下文章

函数返回未定义而不是请求的结果

验证后挂钩未重定向到表单页面

Spring:未调用自定义验证器

在用户定义的函数中返回列名而不是值 SQL

Angular 4 - 验证器自定义函数这是未定义的

返回未定义而不是数字的函数[重复]