9

属性値に基づいて ngModel 属性をタグに追加するディレクティブを作成しようとしています。例えば:

angular.module('myModule').
  directive('myDirective', function() {
    return {
      link: function(scope, elem, attrs) {
        var modelName = 'myPrefix.' + attrs.name;
        attrs.$set('ngModel', modelName);
      }
    };
  });

したがって、このhtmlは:

<input name="foo" my-directive></input>

にコンパイルされます

<input name="foo" ng-model="myPrefix.foo" my-directive></input>

入力の名前を取り、接頭辞を付けて、ngModel 属性をその値に設定します。

リンク関数でこれを実行しようとするinputと、フォームコントローラーに登録されていないように見えるため、form.foo未定義が返されます。

私がやろうとしていることを達成することは可能ですか?

編集:

ngModelHTMLで属性が設定されているようですが、フォームに登録されていないか、ngModelControllerがインスタンス化されていません。スコープ内の値を見るとngModel、入力を変更しても変化しません。

4

2 に答える 2

5

のドキュメントを確認してくださいNgModelController。それはあなたの質問に答えます。詳細な説明については、要旨を次に示します。

link:関数の 4 番目の引数(ng-model値) を取得できます。そのオブジェクトを使用して、モデルの読み取りと設定を行います。

link: function(scope, element, attrs, ngModel) {
    if(!ngModel) return; // do nothing if no ng-model

    // Specify how UI should be updated
    ngModel.$render = function() {
      element.html(ngModel.$viewValue || '');
    };

    // Listen for change events to enable binding
    element.on('blur keyup change', function() {
      scope.$apply(read);
    });
    read(); // initialize

    // Write data to the model
    function read() {
      var html = element.html();
      // When we clear the content editable the browser leaves a <br> behind
      // If strip-br attribute is provided then we strip this out
      if( attrs.stripBr && html == '<br>' ) {
        html = '';
      }
      ngModel.$setViewValue(html);
    }
}

それが役立つことを願っています。

于 2013-10-25T00:00:02.960 に答える