4

我正在使用 Angularjs 1.5 版来验证表单中的输入。

  • ng-required 用于验证所需的所有输入

但是,它不适用于呈现组合的自定义指令。该组合根据传递给它的名为“listId”的参数检索项目。然后,它使用 ng-repeat 对“lookupItems”进行迭代。我想有些东西不见了,比如 ngModel。为什么以及如何实施?

组合指令:

app.directive('combo', function($http) {
    return {
        restrict: 'AE',
        template: '<div class="input-group"> <select ng-model="selectedItem">' +
            '<option  ng-repeat="option in lookupItems" value={{option.ListValueID}}>{{option.Translation.Value}}</option></select>' +
            '  {{selectedItem}} </div>',
        replace: true,
        scope: {
            listId: '=',
            defaultItem: '=',
            selectedItem: '='
        },
        controller: function($scope) {
            $http({
                method: 'GET',
                url: '/home/listvalues?listid=' + $scope.listId
            }).then(function(response) {
                $scope.lookupItems = response.data;
            }, function(error) {
                alert(error.data);
            });
        },
        link: function(scope, element, attrs) {}
    };
});

html 视图:正在迭代包含要呈现的控件类型的属性,然后将其设置 ng-required 为基于“attribute.Required”的布尔值,这是真的。

<form name="profileAttributesForm" ng-controller="metadataCtrl" class="my-form">
    <div ng-repeat="a in attributes">
        <div ng-if="a.DataType == 1">
            <input type="text" name="attribute_{{$index}}" ng-model="a.Value" ng-required="a.Required" />
            <span ng-show="profileAttributesForm['attribute_{{$index}}'].$invalid">Enter a Text</span> text : {{a.Value}}
        </div>

        <div ng-if="a.DataType == 4">
            <div combo list-id="a.LookUpList" name="attribute_{{$index}}" selected-item="a.Value" ng-required="a.Required"></div>
            <span ng-show="profileAttributesForm['attribute_{{$index}}'].$invalid">lookup Required</span> Value from lookup: {{a.Value}}
        </div>
    </div>
</form>

在表单中迭代的属性示例($scope.attributes),我提供它只是为了说明目的:

[{
    "AttributeID": 1,
    "DataType": 4,
    "NodeID": 0,
    "Name": "Name",
    "Description": null,
    "LookUpList": 1,
    "SortAscending": false,
    "Required": true,
    "DefaultValue": "1",
    "Order": 1,
    "Value": ""
}, {
    "AttributeID": 3,
    "DataType": 1,
    "NodeID": 0,
    "Name": "Job Title",
    "Description": null,
    "LookUpList": 0,
    "SortAscending": false,
    "Required": true,
    "DefaultValue": null,
    "Order": 2,
    "Value": ""
}, {
    "AttributeID": 4,
    "DataType": 1,
    "NodeID": 0,
    "Name": "Email",
    "Description": null,
    "LookUpList": 0,
    "SortAscending": false,
    "Required": true,
    "DefaultValue": null,
    "Order": 3,
    "Value": ""
}]
4

1 回答 1

8

为了让ngRequired设置它的验证器,它需要在同一个元素上设置ngModel以便从中获取NgModelController 否则它只会设置所需的属性打开或关闭而不影响父表单。

表单状态($pristine、$valid 等)不是由其 HTML 决定的,而是由注册的 NgModelControllers 决定的。当 ngModel 在表单内链接时,控制器会自动添加。

  • 例如,这<input required type="text">不会影响表单的有效性,即使它是必需的,因为它没有分配 ngModel。
  • 但这<div ng-model="myDiv" required></div>会影响它,因为它是必需的并且已分配给它 ngModel。

在您的情况下,我看到了两种解决方案:

  • 最简单的一个:将 ngRequired 移到里面combo并将其添加到与 ngModel 相同的元素上;为此,您还需要添加一个新的范围变量,例如isRequired
  • 复杂的一个:添加require: 'ngModel'到您的指令并进行适当的更改以使其正常工作。这样,您将拥有更大的控制力和灵活性。例如,如果你想在路上添加ngModelOptions怎么combo办?如果您不实施此解决方案,则必须手动添加它。

    您可以先阅读require: 'ngModel' 的含义是什么?- 这是一个很棒的问题/答案,其中包含不同的示例。如需更深入的解释,请查看Using NgModelController with Custom Directives。附带说明一下,在 Angular 1.5 中,他们改进了语法require- 请参阅$onInit 和 Angular 组件中的新“require”对象语法

于 2016-03-27T09:01:07.910 回答