8

リンク関数で複数の属性を同時に監視する方法がわからないので、すべてのパラメーターを使用してオブジェクトを作成し、監視します。しかし、リンク関数の属性がオブジェクトではなく文字列であることに気付いたので、angular.fromJson(val)を使用しています。

私が見つけたすべての例は、1つのパラメーターを使用するだけです

複数の属性を監視する方法を説明していただけますか?

ありがとう

編集:属性をバインドする必要があるため、attrsパラメーターを使用できません。つまり、属性には補間が必要です。例えば

<ul class="thumbnails">
    <li class="span3" ng-repeat="image in currentSizeInfo.images" >
       <upload-file info = "{{getInfo($index)}}" foo="foo$index" ></upload-file>
    </li>
</ul>

$watchを使わないといけないと思います

link:function (scope, element, attrs ) {
    scope.$watch('info', function (val) {
    // if info is and foo is .... do all the stuff
    })
}
4

1 に答える 1

11

あなたの質問を完全に理解できるかどうかわかりませんので、誤解した場合は訂正してください。ディレクティブの複数の属性から値を取得したいだけですか?したがって、次のようなHTMLがあるとします。

<my-directive attr1="data1" attr2="data2" attr3="data3" />

そして、それらのさまざまな属性の値を取得したいですか?リンク関数では、attrsパラメーターを使用するだけです。例えば:

link: function(scope, element, attrs) {
    var foo1 = attrs.attr1;
    var foo2 = attrs.attr2;
    var foo3 = attrs.attr3;
}

ディレクティブのscopeプロパティを使用して、属性をスコープに自動的にバインドすることもできます。ディレクティブに関するドキュメントを参照してください。だから、このようなもの:

scope: {
    attr1: '@',
    attr2: '@',
    attr3: '@'
}

そして、それらのプロパティは自動的にスコープに含まれます。ただし、私が知ったように、これらの値は、期待したときに常に範囲内にあるとは限りません。したがって、この$watch関数を使用して、必要な処理を実行できます。何かのようなもの:

link: function(scope, element, attrs) {
    scope.$watch("attr1", function () {
         if (scope.attr1)
         {
              //stuff with attr1
         }
    }
    scope.$watch("attr2", function () {
         if (scope.attr2)
         {
              //stuff with attr2
         }
    }
    //....
}

それらをすべて同時に使用する必要がある場合は、の最初のパラメーターに関数を使用して、$watchそれらがすべて存在すると異なる文字列を返し、2番目のパラメーターである関数にロジックを配置することができます。 。だからこのようなもの:

link: function(scope, element, attrs) {
    scope.$watch(function () {
        if (scope.attr1 && scope.attr2 && scope.attr3)
        {
            return "allSet";
        }
        else
        {
            return "";
        }
    }, function (newVal) {
        if ("allSet" == newVal)
        {
            //do stuff with all the properties
        }
    });
}

オブジェクトをスコープにバインドする場合は、「@」の代わりに「=」を使用できます。別のオプションは、親スコープの関数を評価する「&」です。これはすべて、上記のリンク先のディレクティブドキュメントで説明されています。

于 2012-10-19T14:42:16.050 に答える