所以,因为 require and ngRequire are basically the same th-6ren">
gpt4 book ai didi

javascript - Angular : how to bind to required/ngRequired

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:02:09 25 4
gpt4 key购买 nike

我有这个指令,它可以是必需的,也可以不是。它可以有两种使用方式(据我所知)

<my-foo required></my-foo>

<my-foo ng-required="data.value > 10"></my-foo>

所以,因为 require and ngRequire are basically the same thing你会认为指令可以做到这一点

HTML:

<my-foo ng-require="data.isRequired"></my-foo>

JS:

...
.directive('myFoo', function () {
return {
restrict: 'E',
scope: {
required: '='
}
...

DEMO

嗯,不,这行不通,scope.requireundefined。您实际上必须将范围定义更改为

scope: {
required: '=ngRequired'
}

所以问题是处理这两种情况的首选方法是什么,以便将值存储在 scope.required 中?我应该同时定义两者还是使用链接函数中的属性?

最佳答案

您基本上可以选择两种方法:

1。支持 ng-model

的自定义表单元素

如果您查看ng-required 指令源代码,您会发现它只处理ng-model controller。 :

restrict: 'A',
require: '?ngModel',
link: function(scope, elm, attr, ctrl) {
if (!ctrl) return;
attr.required = true; // force truthy in case we are on non input element

ctrl.$validators.required = function(modelValue, viewValue) {
return !attr.required || !ctrl.$isEmpty(viewValue);
};

attr.$observe('required', function() {
ctrl.$validate();
});
}

因此,如果您的自定义指令支持 ng-model,那么您已经支持 ng-required 即:

angular.module('test', [])
.directive('myInput', function(){
return {
restrict: 'E',
require: 'ngModel',
scope: true,
template: '<div><button ng-click="changeValue()">Change Value from: {{currentValue}}</button></div>',
link: function (scope, element, attrs, ngModelCtrl) {
ngModelCtrl.$parsers.push(function(val){
if(!val){
return null;
}
return parseFloat(val, 10) * 100;
});
ngModelCtrl.$render = function() {
scope.currentValue = ngModelCtrl.$viewValue || 'No value';
};
scope.changeValue = function read(){
var newValue = Math.random();
if(newValue > 0.5){
ngModelCtrl.$setViewValue(newValue + "");
} else {
ngModelCtrl.$setViewValue(null);
}
ngModelCtrl.$render();
};
}
};
});

2。包装现有指令并传递 ng-required:

angular.module('test', [])
.directive('myFormElement', function() {
return {
restrict: 'E',
scope: {
model: '=',
required: '='
},
template: '<div>Enter number: <input type="number" ng-model="data.number" ng-required="required"></div>'
};

});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>


<div ng-app="test" ng-init="data={value:'Initial', required: false}">
<form>
Is required: <input type="checkbox" ng-model="data.required">
<my-form-element required="data.required" model="data"></my-form-element>
</form>
</div>

关于javascript - Angular : how to bind to required/ngRequired,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34660318/

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