2012-10-03 9 views
6

私はangularjsでカスタムディレクティブを定義しました。基本的には、ユーザーが選択ボックスから値を選択し、配列に値を追加するということです。これにより、私のカスタムディレクティブが呼び出され、画面上に新しい要素がレンダリングされます。私は、ディレクティブがコントローラの属性にバインドするために生成するテキストフィールドを必要とします。ディレクティブ内でng-modelを使用する

Htmlの

<device-list ng-repeat="device in devices" key="device.key" display-name="device.display_name" bind-prefix="descriptions"></device-list> 

指令

angular.module('device_list_tag', []). 
    directive('deviceList', function() { 
    return { 
     restrict: 'E', 
     require: '?ngModel', 
     scope: { 
     devices: '=', 
     key: '=', 
     displayName: '=', 
     bindPrefix: '@' 
     }, 
     link: function(scope, element, attrs) { 

     var deviceListElement = $(element) 
     var containerDiv = $('<div>') 
      .addClass('row') 


     var labelTag = $('<label>').text(scope.displayName) 
      .addClass('span1') 

     var bindField = attrs.bindPrefix+'.'+scope.key 

     var textField = $('<input>') 
      .addClass('span3') 
      .attr('ng-model', bindField) 

     containerDiv.append(labelTag) 
     containerDiv.append(textField) 

     deviceListElement.append(containerDiv) 
     } 
    } 
    }) 

コントローラ

function DevicesCtrl($scope) { 
    descriptions = {} 
} 

としてNG-モデルは、ディレクティブのスコープに対してローカルであるかのようにそれが表示され、どのように私はそれを適用させますか親?ページにテキストフィールドがたくさんある場合

これは、選択ボックスで生成されたフィールドを除いて機能します。

答えて

9

わかりました。それは私の親属性を '='(Toshによって提案された)として渡すことを含んでいました。また、ng-modelディレクティブを認識させるために$ compileを呼び出す必要がありました。ここでは完全なコードは、私はこのクリーナーを行う方法があると確信していますが、私はそれを働かせてうれしいです。

angular.module('device_list_tag', []). 
    directive('deviceList', function($compile) { 
    return { 
     restrict: 'E', 
     scope: { 
     devices: '=', 
     key: '=', 
     displayName: '=', 
     bindAttr: '=' // added 
     }, 
     link: function(scope, element, attrs) { 

     console.log(scope) 

     var deviceListElement = $(element) 
     var containerDiv = $('<div>') 
      .addClass('row') 


     var labelTag = $('<label>').text(scope.displayName) 
      .addClass('span1') 

     var bindField = 'bindAttr.'+scope.key 

     var textField = $('<input>') 
      .addClass('span3') 
      .attr('ng-model', bindField) 

     $compile(textField)(scope) // added 

     containerDiv.append(labelTag) 
     containerDiv.append(textField) 

     deviceListElement.append(containerDiv) 
     } 
    } 
    }) 
+0

通常、ディレクティブでテンプレート属性を使用してオブジェクトをバインドするのはなぜですか?例えば。:template: ' ...'これはテンプレートのためのものではありませんか?ページの一番下にある例のように:http://docs.angularjs.org/guide/directive –

+0

問題は、ディレクティブ内でバインドする属性の名前がわかりません。私はテンプレートを使用しようとしましたが、私が遭遇した問題は{{some.random.attribute}}を動作させる方法でした。 – Mike

+0

私は固定変数をバインドし、その変数をsome.random.attributeの値に更新します。私はそれが何かを考え出しました。たとえば、親スコープに接続されている、またはサーバーを呼び出すgetSomeRandomAttr(key)という関数を設定することができます。次に、関数を呼び出した後に固定変数を更新するだけです。 –

2

bindField: '='をスコープのディレクティブ定義に追加することができます。 この変数を使用して親スコープに接続します。

+0

を書き込む必要があり、変数をテキストフィールドに "バインド"する方法を理解できませんでした。何か提案はありますか? – Mike

1

あなたは)

1、求めている私たちは分離株スコープのフォーム要素を編集しながら、親スコープ・アレイが更新してください。はいの場合、私はこのフィドルで同様のシナリオを複製しましたhttp://jsfiddle.net/W7YrZ/2/

私がやろうとしていたことの要約。

1)反復の現在の項目を使用して、にng-repeatの属性を割り当てます。

2)次に親スコープのコンテキストでこの属性を評価して、親スコープの配列オブジェクトの1つ(ここではprofiles)への参照(ポインタ)を与えます。

3)@マークRajcokは "プリミティブは値でコピーされ、オブジェクトは参照によってコピーされる"と述べています。私はそのオブジェクトをテンプレート文字列のテキストボックスにステップ2を介してバインドしています。ただangular.element

$('<input>').addClass('span3') 

にセレクタ$を交換するJavaScript、角度と検証のためにあるのjQueryコードの清潔さの理由のため

+0

これは私のためにはうまくいっていて、欠けていたキーでした(私の場合は、日付範囲指令を書いていて、ngモデルを開始および終了範囲変数にマッピングするのに苦労していました)。 – jadrake

-3

は、私は今、それと遊んだ

angular.element('<input>').addClass('span3') 
関連する問題