2015-02-11 16 views
5

Denetleyicimde (var myObject) bir nesne değişkeni var, IHM'de 3 giriş metnine bölünmüş.odağı angularjs ile bir sonraki giriş metnine dönüştürün

Odaklanan kişi maxLength'a ulaştığında odağı otomatik olarak bir sonraki girişe değiştirmek istiyorum.

var myObject = { 
    part1:"", 
    part2:"", 
    part3:"" 
} 



<form> 
    <input type="text" id="part1" ng-model="myObject.part1" maxlength="7"/> 
    <input type="text" id="part2" ng-model="myObject.part2" maxlength="12"/> 
    <input type="text" id="part2" ng-model="myObject.part2" maxlength="12"/> 
</form> 
+0

Belki de aşağıdaki yardımcı olabilir: http://stackoverflow.com/questions/18086865/angularjs-move-focus-to-next-control-on-enter –

cevap

10

Bunun için bir yönergeyi kullanmanız gerekir: şöyle

app.directive("moveNextOnMaxlength", function() { 
    return { 
     restrict: "A", 
     link: function($scope, element) { 
      element.on("input", function(e) { 
       if(element.val().length == element.attr("maxlength")) { 
        var $nextElement = element.next(); 
        if($nextElement.length) { 
         $nextElement[0].focus(); 
        } 
       } 
      }); 
     } 
    } 
}); 

Ve şeklinizi güncelleme: Sen hareket olabilir

<form> 
    <input type="text" id="part1" ng-model="myObject.part1" maxlength="7" move-next-on-maxlength /> 
    <input type="text" id="part2" ng-model="myObject.part2" maxlength="12" move-next-on-maxlength /> 
    <input type="text" id="part2" ng-model="myObject.part2" maxlength="12"/> 
</form> 

Demo

<form> eleme yönergesi nt yerine, ancak jqLite'ınyöntemine göre, yalnızca etiket adlarına göre öğeleri bulmanız kısıtlanır. Tam jQuery kullanıyorsanız veya bunun yerine vanillaJS'yi kullanabilirseniz, bu yöntemi öneririm.

+0

teşekkür ederim arkadaşım !! –

+0

Bunun için teşekkür ederim ama 'String' ile karşılaştırılamazsınız: : (element.val(). Length == element [0] .maxLength) ... – grindking

+0

@grindking Tabii ki yapabilirsiniz, bu Javascript! :) '12 ==" 12 "'. * Katı * eşitliği kullanmadığınız sürece, genellikle iyi olacaksınız. – CodingIntrigue

1

Kabul edilen yanıt çalışır, ancak yalnızca alanlar hemen kardeşse.

angular 
.module('move-next-directive', []) 
.directive('moveNextOnMaxlength', 
    function() { 
    return { 
     restrict: "A", 
     link: function(scope, elem, attrs) { 
     elem.on('input', function(e) { 
      var partsId = attrs.id.match(/focus(\d+)/); 
      var currentId = parseInt(partsId[1]); 

      var l = elem.val().length; 
      if (l == elem.attr("maxlength")) { 
      nextElement = document.querySelector('#focus' + (currentId + 1)); 
      nextElement.focus(); 
      } 
     }); 
     } 
    } 
    } 
); 

her giriş alanına bir numaralı "odak" id ekleyin: Bu cevaba

<div class="row"> 
    <div class="col-xs-4"> 
    <input type="text" id="focus1" maxlength="4" move-next-on-maxlength /> 
    </div> 
    <div class="col-xs-4"> 
    <input type="text" id="focus2" maxlength="4" move-next-on-maxlength /> 
    </div> 
    <div class="col-xs-4"> 
    <input type="text" id="focus3" maxlength="4" /> 
    </div> 
</div> 

Kredi örneğin sen orada kendi sütununda 3 alanları her varsa, farklı bir çözüm gerekir: https://stackoverflow.com/a/33007493/3319392

+0

Bu sürümü, girdilerim farklı açıklıklardayken kullandım, teşekkürler. Ben 10'dan fazla eleman için izin vermek için regex değiştirmek zorunda kaldım, bu odağı adında sonsuz bir sayıya izin verir *: 'var partsId = attrs.id.match (/ focus (\ d +) /); –

+0

Teşekkürler @eric .. Kodu, sonsuz sayıda odak alanına izin vermek için önerildiği şekilde düzenledim. – Jette

İlgili konular