2013-03-21 11 views
8

Buduję aplikację internetową dla komputera z ekranem dotykowym, który wymaga klawiatury ekranowej i próbuję użyć tego znakomitego (lub najmniejszego z nich) Udało mi się znaleźć, że to nie była straszna) klawiatura. https://github.com/Mottie/Keyboard/Zaktualizuj modele AngularJS z wtyczki jQuery z wywołaniem "na zmianę"

Problem polega na tym, jak już można się domyślić, że model nie jest aktualizowany podczas używania klawiatury ekranowej. To jest mój kod, który rodzaj robót, ale wszelkiego rodzaju brzydkie:

partitial HTML:

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

Inicjowanie klawiaturę z partitial kontrolera widoku:

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

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

Więc na zmiana wywołana przez wtyczkę jQuery mogę uruchomić coś. Oczywiście działa to tylko aktualizując pojedyncze pole/model, nazwę jeden (podczas gdy adres e-mail nie działa w ogóle i nadpisze pole nazwy), potrzebuję dowolnej liczby pól do zaktualizowania, gdy są używane z klawiaturą, a jeden poprawny. Jak rozwiązać ten problem w sposób mniej straszny, niezmienny (jeśli to możliwe i niezbyt skomplikowany)?

+0

Użyj dyrektywy, aby wywołać doskonałą metodę klawiatury na klawiaturze. W takim przypadku możesz mieć ngModel elementu. – Abilash

+0

Sugerowanie czegoś podobnego do ui-select2 z angular-ui.js – Abilash

+0

Czy Angular-UI jest potrzebny, a nawet pomocny w tym? Coś więcej niż zwykłe pole tekstowe jest przesadą dla tego konkretnego problemu, chyba że zawiera już lepszą klawiaturę ekranową. –

Odpowiedz

12

Sposobem napisania tego w Angular jest napisanie dyrektywy. Możesz docenić dyrektywę z określoną nazwą klasy.

Więc twój dyrektywa będzie wyglądać

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); 
     } 
    }); 
    } 
    }; 
}); 

Teraz, jeśli każdy element ma zarówno klasę klawiaturą i NG-modelu zdefiniowanego czasu, klawiatura powinna pop-up. Mam nadzieję że to pomoże.

+0

To na pewno działa świetnie. Jestem nowy w AngularJS i nie mam doświadczenia w programowaniu stron internetowych, ale mogę powiedzieć, że jest to przyjemne środowisko do pracy. Będę musiał spróbować dowiedzieć się, kiedy stosować dyrektywy. –

+0

Wow .. Napisałem to ślepo .. Tak więc, spodziewam się, że działa bez żadnych modyfikacji. Jeśli potrzebujesz manipulować DOM lub zapytać DOM i uzyskać element, będziesz potrzebować dyrektywy. – ganaraj

+0

Oczekuję, że nie trzeba owijać elementu jako elementu $ (element), ponieważ jest to już obiekt 'jQuery'. –

2

Wprowadziłem modyfikację dyrektywy ganraj. Teraz model aktualizuje się za każdym kliknięciem przycisku klawiatury.

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); 
       }); 
      } 
     } 
    }); 
    } 
    }; 
}); 
Powiązane problemy