angularJS valdr + ui-select 验证
angularJS valdr + ui-select validation
我在谷歌上搜索了这个问题,但仍然找不到关于它的正确讨论。我们在表单(angularJS 应用程序)中使用 valdr 和 ui select,我们遇到了 ui-select 输入的问题渲染不会获得名称属性,因此,angular 会抛出错误:
Error: Form element with ID "undefined" is not bound to a field name.
at d.link (http://localhost:8080/bower_components/valdr/valdr.min.js:1:8414)
at invokeLinkFn (http://localhost:8080/bower_components/angular/angular.js:8141:9)
at nodeLinkFn (http://localhost:8080/bower_components/angular/angular.js:7653:11)
at compositeLinkFn (http://localhost:8080/bower_components/angular/angular.js:7009:13)
at nodeLinkFn (http://localhost:8080/bower_components/angular/angular.js:7648:24)
at http://localhost:8080/bower_components/angular/angular.js:7884:13
at processQueue (http://localhost:8080/bower_components/angular/angular.js:13071:27)
at http://localhost:8080/bower_components/angular/angular.js:13087:27
at Scope.$get.Scope.$eval (http://localhost:8080/bower_components/angular/angular.js:14287:28)
at Scope.$get.Scope.$digest (http://localhost:8080/bower_components/angular/angular.js:14103:31) <input type="text" autocomplete="off" tabindex="-1" aria-expanded="true" aria-label="{{ $select.baseTitle }}" aria-owns="ui-select-choices-{{ $select.generatedId }}" aria-activedescendant="ui-select-choices-row-{{ $select.generatedId }}-{{ $select.activeIndex }}" class="form-control ui-select-search ng-pristine ng-untouched ng-valid" placeholder="{{$select.placeholder}}" ng-model="$select.search" ng-show="$select.searchEnabled && $select.open">
所以我们在 ui-select 指令上尝试了一些 hack,比如 templateCache 重写/修改,使用相同模型隐藏输入但结果是相同的。
顺便说一句,重写 templateCache 是最糟糕的方法,因为该指令在整个应用程序范围内被其他指令使用,我们无法破解整个应用程序。
有人遇到过这个问题吗?
如果 name
属性在输入元素上不存在 valdr
则抛出异常。
ui-select
在内部创建一个没有 name
属性的输入字段。因此错误。
您可以试试这个来消除错误。
directive('input', function () {
var count = 0;
return {
restrict: 'E',
compile: function () {
return {
pre: function (scope, element, attrs) {
// if the input is created by ui-select and has ng-model
if (element.hasClass('ui-select-search') && attrs.ngModel) {
if (!attrs.name) { // if the input is not having any name
attrs.name = 'ui-select' + (++count); // assign name
}
}
}
}
}
}
})
我在谷歌上搜索了这个问题,但仍然找不到关于它的正确讨论。我们在表单(angularJS 应用程序)中使用 valdr 和 ui select,我们遇到了 ui-select 输入的问题渲染不会获得名称属性,因此,angular 会抛出错误:
Error: Form element with ID "undefined" is not bound to a field name.
at d.link (http://localhost:8080/bower_components/valdr/valdr.min.js:1:8414)
at invokeLinkFn (http://localhost:8080/bower_components/angular/angular.js:8141:9)
at nodeLinkFn (http://localhost:8080/bower_components/angular/angular.js:7653:11)
at compositeLinkFn (http://localhost:8080/bower_components/angular/angular.js:7009:13)
at nodeLinkFn (http://localhost:8080/bower_components/angular/angular.js:7648:24)
at http://localhost:8080/bower_components/angular/angular.js:7884:13
at processQueue (http://localhost:8080/bower_components/angular/angular.js:13071:27)
at http://localhost:8080/bower_components/angular/angular.js:13087:27
at Scope.$get.Scope.$eval (http://localhost:8080/bower_components/angular/angular.js:14287:28)
at Scope.$get.Scope.$digest (http://localhost:8080/bower_components/angular/angular.js:14103:31) <input type="text" autocomplete="off" tabindex="-1" aria-expanded="true" aria-label="{{ $select.baseTitle }}" aria-owns="ui-select-choices-{{ $select.generatedId }}" aria-activedescendant="ui-select-choices-row-{{ $select.generatedId }}-{{ $select.activeIndex }}" class="form-control ui-select-search ng-pristine ng-untouched ng-valid" placeholder="{{$select.placeholder}}" ng-model="$select.search" ng-show="$select.searchEnabled && $select.open">
所以我们在 ui-select 指令上尝试了一些 hack,比如 templateCache 重写/修改,使用相同模型隐藏输入但结果是相同的。
顺便说一句,重写 templateCache 是最糟糕的方法,因为该指令在整个应用程序范围内被其他指令使用,我们无法破解整个应用程序。
有人遇到过这个问题吗?
如果 name
属性在输入元素上不存在 valdr
则抛出异常。
ui-select
在内部创建一个没有 name
属性的输入字段。因此错误。
您可以试试这个来消除错误。
directive('input', function () {
var count = 0;
return {
restrict: 'E',
compile: function () {
return {
pre: function (scope, element, attrs) {
// if the input is created by ui-select and has ng-model
if (element.hasClass('ui-select-search') && attrs.ngModel) {
if (!attrs.name) { // if the input is not having any name
attrs.name = 'ui-select' + (++count); // assign name
}
}
}
}
}
}
})