gpt4 book ai didi

angularjs - Angular ng-required 不适用于自定义指令

转载 作者:行者123 更新时间:2023-12-04 23:41:29 24 4
gpt4 key购买 nike

我正在使用 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 View :正在迭代包含要呈现的控件类型的属性,然后将其设置 ng-required 为基于“attribute.Required”的 bool 值,这是真的。
    <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": ""
    }]

    最佳答案

    为了ngRequired设置其验证器 它需要 ngModel设置在同一元素上以获得 NgModelController来自它 , 否则它只会将 required 属性设置为 on 或 off 而不会影响父表单。

    表单状态($pristine、$valid 等)不是由它的 HTML 决定的 但是通过注册的 NgModelControllers .当 ngModel 链接到表单内时,会自动添加 Controller 。

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

  • 在您的情况下,我看到两种解决方案:
  • 简单的:在内部移动 ngRequired combo并将其添加到与 ngModel 相同的元素上;为此,您还需要添加一个新的范围变量,例如isRequired
  • 复杂的一:添加 require: 'ngModel'到您的指令并进行适当的更改以使其正常工作。 这样,您将拥有更大的控制力和灵活性 .例如,如果以后您想添加 ngModelOptions,您会怎么做?至 combo ?如果您不实现此解决方案,则必须手动添加。

    您可以先阅读 What's the meaning of require: 'ngModel'? - 这是一个很棒的问题/答案,其中包含不同的示例。如需更深入的解释,请查看 Using NgModelController with Custom Directives .作为旁注,在 Angular 1.5 中,他们改进了 require 的语法。 - 见 $onInit and new "require" Object syntax in Angular components .
  • 关于angularjs - Angular ng-required 不适用于自定义指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36243703/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com