Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在另一个指令中绑定一个指令的方式是什么?_Javascript_Angularjs_Angularjs Directive - Fatal编程技术网

Javascript 在另一个指令中绑定一个指令的方式是什么?

Javascript 在另一个指令中绑定一个指令的方式是什么?,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我正在编写一个指令,用于在输入上建立客户端和服务器端验证。它应该接受一组验证器名称(例如,aa validate=“required,unique”),遍历它们,为所有可能的验证器添加客户端验证指令(例如,required应该添加ngRequired),其余的则发布到服务器端验证API 最后一部分工作正常:我正在查看ngModel属性,并以100ms的超时时间发布到服务器。但是,从my指令的链接函数中设置客户端验证指令不会导致编译和链接它们。换句话说,他们什么也不做。这是我的密码: angula

我正在编写一个指令,用于在输入上建立客户端和服务器端验证。它应该接受一组验证器名称(例如,
aa validate=“required,unique”
),遍历它们,为所有可能的验证器添加客户端验证指令(例如,
required
应该添加
ngRequired
),其余的则发布到服务器端验证API

最后一部分工作正常:我正在查看
ngModel
属性,并以100ms的超时时间发布到服务器。但是,从my指令的链接函数中设置客户端验证指令不会导致编译和链接它们。换句话说,他们什么也不做。这是我的密码:

angular.module('form', [])
    .directive('aaValidate', ['$http', function($http) {
        return {
            priority: 1,
            restrict: 'A',
            require: 'ngModel',
            link: function(scope, element, attrs, ctrl) {
                var validate = attrs.aaValidate,
                    validators = validate.split(',');

                // This is the problem!
                //
                // Populate possible client-side validators
                for (var i = 0, len = validators.length; i < len; i++) {
                    var validator = validators[i];
                    switch (validator) {
                        case 'required':
                            attrs.$set('ngRequired', 'true'); break;
                        // ... and so on for ngPattern, etc.
                        default: break;
                    }
                }

                scope.$watch(attrs.ngModel, function(value) {
                    // This part works!
                    //
                    // Clear existing timeout, reset it with an
                    // $http.post to my validation API, the result is
                    // passed into ctrl.$setValidity
                });
            }
        }
    }]);
angular.module('form',[])
.directive('aaValidate',['$http',function($http){
返回{
优先事项:1,
限制:“A”,
要求:'ngModel',
链接:函数(范围、元素、属性、ctrl){
var validate=attrs.aaValidate,
validators=validate.split(',');
//这就是问题所在!
//
//填充可能的客户端验证程序
for(var i=0,len=validators.length;i
我确实尝试过注入
$compile
,并在链接函数的末尾重新编译元素。我最终得到了无限递归,可能是因为我没有删除一些属性,但即使我这样做,感觉还是很难看。正确的方法是什么

非常感谢您的帮助。提前谢谢



EDIT:jsFiddle:

我的第一个答案是错误的-我认为没有办法使用
$compile
服务。下面是如何在不获得无限递归的情况下实现它。我基本上将该指令分为两个指令——一个是添加验证指令,删除自身并重新编译。另一个做其他的事情:

angular.module('form',[])
.directive('aaValidate',['$http','$compile',函数($http,$compile){
返回{
链接:函数(范围、元素、属性){
var validate=attrs.aaValidate,
validators=validate.split(',');
//填充可能的前端验证器
for(var i=0,len=validators.length;i

必须重新编译链接元素,才能使其在ng repeat中工作。我已经更新了小提琴:

Hi@joakimbl,感谢您的快速回复。不幸的是,这仍然不起作用。我在
ngRequired
链接函数中放置了一个
console.log
,发现它从未被调用。我尝试过将问题代码放入预编译、预链接和后链接阶段,但没有成功。好的,你认为你能提供一个plunker/jsfiddle吗?用一个jsfiddle链接编辑问题。如您所见,删除输入中的文本不会导致
myForm.value.$valid
变为
false
我认为您必须使用$compile-我已经做了一个更新,向您展示了如何避免无限递归