2013-03-21 20 views
8

私はオンスクリーンキーボードが必要なタッチスクリーンコンピュータ用のWebアプリケーションを構築しています。この優れた(または少なくとも唯一のもの私はそれがひどいことではないことが分かった)キーボード。 https://github.com/Mottie/Keyboard/「変更中」コールバック付きのjQueryプラグインからAngularJSモデルを更新

画面上のキーボードを使用しているときにモデルが更新されないという問題は、既に推測していることです。これは、作品の並べ替え私のコード、ですが、それ醜いのすべての種類:

partitial HTML:だから、上の

$('.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ページコントローラから、キーボードを初期化しますjQueryプラグインによってトリガされた変更は何か実行できます。明らかにこれは、単一のフィールド/モデル、名前の更新(電子メールは全く機能しないし、名前フィールドを上書きします)、キーボードで使用するときに更新するフィールドがいくつでも必要です。正しいもの。これを解決するにはどうすればよいでしょうか?

+0

優れたキーボードのキーボードメソッドを呼び出すためのディレクティブを使用します。その場合、uは要素のngModelを持つことができます。 – Abilash

+0

angular-ui.jsのui-select2に似たものを提案する – Abilash

+0

Angular-UIはこれに必要なの?シンプルなテキストフィールド以上のものは、スクリーンキーボードが既に含まれていない限り、この特定の問題のために過剰です。 –

答えて

12

これをAngularで書く方法は、実際に指示文を書くことです。特定のクラス名のディレクティブをアセンブルすることができます。

任意の要素は、あなたのキーボードがポップアップをする必要があり、その後、定義されたキーボードのクラスとNG-モデルの両方を持っているのであれば、あなたのディレクティブは今

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

ようになります。お役に立てれば。

+0

それは確かに、それは素晴らしい仕事。私はAngularJSを初めて使っていて、ウェブプログラミングの背景は持っていませんが、これはうまくいくフレームワークだと言えるでしょう。私はディレクティブをいつ使うべきかを考えなければならないでしょう。 –

+0

うわー..私はその盲目を書きました。だから、何の変更もせずに動作することを期待しています。 DOMを操作したり、DOMを照会して要素を取得したりする必要がある場合は、通常、ディレクティブが必要です。 – ganaraj

+0

'jQuery'オブジェクトであるので、' element'を '$(element) 'としてラップする必要はありません。 –

2

ganraj指令の変更を行いました。今、モデルはキーボードボタンのクリックごとに更新されています。

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); 
       }); 
      } 
     } 
    }); 
    } 
    }; 
}); 
関連する問題