2013-03-21 23 views
8

Ekran klavyesi gerektiren bir dokunmatik ekranlı bilgisayar için bir web uygulaması yapıyorum ve bu mükemmel (veya en az bir tanesini kullanmaya çalışıyorum) Bu korkunç değildi bulmak mümkün) klavye. Bir jQuery eklentisinden "değiştir" geri bildirimi ile AngularJS modellerini güncelleştirin

Sorun, önceden tahmin edebileceğiniz gibi, ekran klavyesini kullanırken modelin güncellenmemesidir. Bu eserlerin sıralama benim kod, ama çirkin her türlü:

partitial HTML: Öyleyse

$('.keyboard') 
.keyboard({ 
    stickyShift: false, 
    usePreview: false, 
    autoAccept: true, 

    change: function(e, kb, el) { 
     $scope.newUser.name = el.value; 
    } 
}); 

:

<input type="text" class="keyboard" ng-model="newUser.name"> 
<input type="text" class="keyboard" ng-model="newUser.email> 

partitial sayfa denetleyicisinden, klavyeyi başlatılıyor jQuery eklentisi tarafından tetiklenen değişiklik Bir şey çalıştırabilirim. Açıkçası bu sadece tek bir alan/model, bir isim (e-posta hiç çalışmaz ve isim alanının üzerine yazılırken) güncellenir, klavyeyle kullanıldığında güncellenecek herhangi bir sayıya ihtiyacım var. doğru olan. Bunu daha az korkunç, kodlanmamış (mümkünse ve çok karmaşık olmayan) şekilde nasıl çözebilirim?

+0

Mükemmel klavyenin klavye yöntemini çağırmak için bir yönerge kullanın. Bu durumda, öğenin ngModel'i olabilir. – Abilash

+0

angular-ui.js ui-select2 benzeri bir şey önerme – Abilash

+0

Angular-UI bunun için gerekli veya hatta yararlı mıdır? Daha iyi bir ekran klavyesi de içermedikçe, basit bir metin alanından başka bir şey, bu sorun için fazladır. –

cevap

12

Bunu Açısal olarak yazmanın yolu aslında bir yönerge yazmaktır. Belirli bir sınıf adıyla bir direktif belirleyebilirsiniz. Herhangi bir eleman daha sonra tanımlanan klavye ve ng-Modelinin bir sınıf hem sahipse

Yani, yönerge Şimdi

app.directive('keyboard',function(){ 
    return { 
    require : '?ngModel', 
    restrict : 'C', 
    link : function(scope,element,attrs,ngModelCtrl){ 
     if(!ngModelCtrl){ 
     return; 
     } 
     $(element).keyboard({ 
     stickyShift: false, 
     usePreview: false, 
     autoAccept: true, 

     change: function(e, kb, el) { 
      ngModelCtrl.$setViewValue(el.value); 
     } 
    }); 
    } 
    }; 
}); 

benzer görünümde olacaktır, klavye pop-up gerekir. Bu yardımcı olur umarım.

+0

Elbette, bu harika çalıştı. Ben AngularJS için yeni ve web programlama bir arka plan yok ama bununla çalışmak için güzel bir çerçeve olduğunu söyleyebiliriz. Direktifleri ne zaman kullanacağımı anlamaya çalışmam gerekecek. –

+0

Wow .. O körü körüne yazdım .. Dint hiç bir değişiklik yapmadan çalışmasını bekliyor. DOM'u işlemek veya DOM'u sorgulamanız ve öğenin ele geçirilmesi gerekiyorsa, genellikle bir yönerge gerekir. – ganaraj

+0

"jQuery" nesnesi olduğu için 'elementi' $ (element) olarak sarmalamanız gerekmediğini umuyorum. –

2

Ben ganraj yönergesini değiştirdim. Artık model her tuştakımında güncelleniyor.

app.directive('keyboard',function(){ 
    return { 
    require : '?ngModel', 
    restrict : 'C', 
    link : function(scope,element,attrs,ngModelCtrl){ 
     if(!ngModelCtrl){ 
     return; 
     } 

     $(element).keyboard({ 
     stickyShift: false, 
     usePreview: false, 
     autoAccept: true, 

     change: function(e, kb, el) { 
      if(!scope.$$phase && !scope.$root.$$phase) 
      { 
       scope.$apply(function(){ 
        ngModelCtrl.$setViewValue(el.value); 
       }); 
      } 
     } 
    }); 
    } 
    }; 
});