Javascript angularjs指令允许制表符字符

Javascript angularjs指令允许制表符字符,javascript,angularjs,Javascript,Angularjs,我试图创建一个angularjs指令,允许在文本字段中输入制表符。其部分工作,但错误未正确显示。我希望这个字段也是必需的。这是我的密码 .directive('allowTab', function () { return { require: 'ngModel', link: function(scope, ele, attrs, c) { ele.bind('keydown keyup', fun

我试图创建一个angularjs指令,允许在文本字段中输入制表符。其部分工作,但错误未正确显示。我希望这个字段也是必需的。这是我的密码

.directive('allowTab', function () {
        return {
            require: 'ngModel',
            link: function(scope, ele, attrs, c) {
                ele.bind('keydown keyup', function(e) {
                    var val = this.value;
                    if (e.keyCode === 9 && e.type === 'keydown') { // tab was pressed

                        // get caret position/selection
                        var start = this.selectionStart,
                            end = this.selectionEnd;

                        // set textarea value to: text before caret + tab + text after caret
                        this.value = val.substring(0, start) + '\t' + val.substring(end);

                        // put caret at right position again
                        this.selectionStart = this.selectionEnd = start + 1;

                        c.$setValidity('allowTab', true);
                        // prevent the focus lose
                        return false;

                    }
                    else if(e.keyCode !== 9 && e.type === 'keyup') {
                        if(val === '') {
                            c.$setValidity('allowTab', false);
                        }
                        else {
                            c.$setValidity('allowTab', true);
                        }
                    }
                });
             }
        }
    });

以下是JSFIDLE:

您是否试图在文本框中的制表符后保持焦点

您必须使用preventDefault()方法:


在jQuery中更新文本框值并设置验证,而不是在angular生命周期中。要及时更新前端,需要调用scope.$digest()将角度模型与dom同步

                // put caret at right position again
                this.selectionStart = this.selectionEnd = start + 1;

                c.$setValidity('allowTab', true);
                scope.$digest();

我已经扩展了Michael版本,并使其完全符合我的要求,下面是JSFIDLE:

                // put caret at right position again
                this.selectionStart = this.selectionEnd = start + 1;

                c.$setValidity('allowTab', true);
                scope.$digest();
else if (e.keyCode !== 9 && e.type === 'keyup') {
    var hasTab = val.indexOf('\t') > -1;
    if(hasTab){
        c.$setValidity('allowTab', true);
    }
    else if(val == '') {
        c.$setValidity('allowTab', false);
    }
    else {
        c.$setValidity('allowTab', true);
    }                                     
    scope.$digest();
}