0

JSFiddle は次のとおりです。

http://jsfiddle.net/DfLdF/

問題の説明は次のとおりです。いくつかのロジックを含むフォームをラップするコントローラーがあり、ディレクティブ ハッシュ内でコントローラーとして定義できません。

次のように、ディレクティブからフィールドに動的に入力する機能が必要です。

 App.Directive.SomeAwesomeDirective = ->
     restrict: 'C'

     link: (scope, element, attrs) ->
         someValue = scope.someValue
         field = element.find(".some-class")
         scope.fieldValue = someValue
         field.ngModel = "scope.fieldValue"
         field.ngClass = "scope.someAwesomeClass"

         monitorFields = (newValue, oldValue) ->
              console.log "we are here"
              console.debug newValue
              console.debug oldValue
              scope.addValue(newValue)

         scope.$watch "scope.fieldValue", monitorFields, true

次の条件を満たす必要があります。

1) textfields の値が変更されたら、scope.fieldValue を更新したい。2) これが発生した後、検証のために新しい値を使用して addValue メソッド (ラッピング コントローラーで定義) を呼び出す必要があります。3) addValue メソッドは someAwesomeClass スコープ変数を設定し、入力フィールド クラスを更新する必要があります。4) 適用される ngClasses は ng-valid/ng-invalid です。フォーム検証は、これらのクラスに対応して正しく機能する必要があります

私のjsfiddleに見られるように、これらのことは現在起こっていません.理由はわかりません...

ありがとう!

4

1 に答える 1

1

someClass親で関数を実行するディレクティブを定義することで修正できます。formタグは、execute実行する関数を保持する追加の属性を取得します。ディレクティブは、ディレクティブのコントローラー (したがって、require: '^dir')someClassを検索して実行します。dir

別の解決策は、ディレクティブを削除し、ディレクティブで属性dirを定義することでした (たとえば、各入力フィールドが異なる関数をトリガーする必要がある場合)。executesomeClass

<form class="dir" execute="someFunction">

ディレクティブ:

app.directive('dir', function () {
  return {
    restrict: 'C',
    scope: {
      execute: '='
    },
    controller: function ($scope) {
      this.execute = $scope.execute;
    }
  };
});


app.directive('someClass', function () {
  return {
    restrict: 'C',
    require: '^dir',
    replace: true,
    template: '<INPUT name="foo" id="bar" type="text" ng-model="fieldValue" >',
    scope: {
      fieldValue: '@'
    },
    link: function (scope, elm, attrs, ctrl) {
      var monitorField = function (newValue, oldValue) {
        if (newValue) {
           ctrl.execute(newValue);
        }
      };
      scope.$watch("fieldValue", monitorField, true);
    }
  };
});

jsFiddleを参照してください。

于 2013-01-09T09:32:04.537 に答える