Angularjs 在输入和格式之间移动的角度指令

Angularjs 在输入和格式之间移动的角度指令,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我有一个指令,它对一组六个一位数的文本输入执行多项操作: 1如果用户输入小写字母,则将输入大写 2.拒绝任何非字母字符 3.如果用户按backspace键,则向后移动一个输入;如果用户按backspace键两次,则删除上一个字符 第1项和第2项工作正常,但第3项未按预期工作。现在,backspace转到上一个输入并在一个步骤中删除该输入 这是更新后的代码。我如何让#3按上述方式工作 .directive('capitalize',function(){ 返回{ 要求:'ngModel', 链

我有一个指令,它对一组六个一位数的文本输入执行多项操作:

1如果用户输入小写字母,则将输入大写 2.拒绝任何非字母字符 3.如果用户按backspace键,则向后移动一个输入;如果用户按backspace键两次,则删除上一个字符

第1项和第2项工作正常,但第3项未按预期工作。现在,backspace转到上一个输入并在一个步骤中删除该输入

这是更新后的代码。我如何让#3按上述方式工作


.directive('capitalize',function(){
返回{
要求:'ngModel',
链接:函数(范围、元素、属性、模型控制){
var大写=函数(输入值){
如果(inputValue==未定义)inputValue='';
var charString=inputValue.replace(//[^a-zA-Z]/g',);//拒绝非字母字符
var shouldDelete=false;
var shouldMoveBack=true;
元素绑定('keyup',函数(事件){
var key=event.keyCode;
如果(键===8){
if(shouldDelete==true){
shouldDelete=false;
元素[0]。值=“”;
}否则{
shouldDelete=true;
如果(!scope.$first&&shouldMoveBack==true){
元素[0]。previousElementSibling.focus();
shouldMoveBack==false;
}否则{
shouldMoveBack==true;
}
}
}否则{
if(charString>'')元素[0].nextElementSibling.focus();
}
});
var大写=charString.toUpperCase();
如果(大写!==输入值){
modelCtrl.$setViewValue(大写);
modelCtrl.$render();
}
回报资本化;
}
modelCtrl.$parsers.push(大写);
大写(范围[attrs.ngModel]);//大写初始值
}
};
})

您可以通过执行
event.preventDefault()
来防止默认的退格行为,而不是将注意力集中在第一种情况下的前一个同级,并使用左箭头的keyCode创建一个按键事件,并手动触发它以实现第三种情况下的第一种情况。对于第二种情况,您可以保留一个计数器,以查看是否第二次按下backspace并触发默认行为。检查下面的示例

    var count = 0;
    var leftArrow = $.Event("keyup");
    leftArrow.which = 37;//37 being the keycode of left arrow

    element.bind('keyup', function (event) {
        var key = event.keyCode;
        // 37 , 8
        if (key === 8) {// if it is backspace
            count++;
            if (count > 1) {
                count = 0;
            } else {
                // prevent the default behaviour
                event.preventDefault();
                // create a left arrow keypress event
                element.triggerHandler(leftArrow);
            }
        }
    }

它会删除输入,因为您设置了
值='
。没有办法知道用户是否在单个
keyup
事件中连续按两次键……我添加了一个条件
shouldMoveBack
,因此光标不会移回上一个输入,除非在上一个backspace
keyup
中删除它。但是,它仍然会在每次退格
keyup
时跳回。我想我需要检测光标是向前移动到输入中还是向后移动到输入中。从概念上讲,这是有意义的,但会生成一个错误:
元素。触发器不是一个函数
左箭头不会将光标移动到上一个输入。“返回”选项卡不执行此操作,但光标仅在一瞬间返回到上一个输入,然后返回。我仍然认为这个方法会起作用,所以我会继续走这条路……如果我是对的,它应该是
元素。triggerHandler(leftArrow)
引用
triggerHandler
不会产生错误,但光标不会移动。可能地
    var count = 0;
    var leftArrow = $.Event("keyup");
    leftArrow.which = 37;//37 being the keycode of left arrow

    element.bind('keyup', function (event) {
        var key = event.keyCode;
        // 37 , 8
        if (key === 8) {// if it is backspace
            count++;
            if (count > 1) {
                count = 0;
            } else {
                // prevent the default behaviour
                event.preventDefault();
                // create a left arrow keypress event
                element.triggerHandler(leftArrow);
            }
        }
    }