3

ディレクティブによって作成されたモデルにアクセスする必要があり、同時にディレクティブで属性を取得する必要があります。

JS:

module.directive('createControl', function($compile, $timeout){
 return {            
   scope: {        
     name: '=Name' // Dynamically created ng-model in the directive element
   },
   link: function(scope, element, attrs){
     attrs.$observe('createControl', function(){
       attrs.createControl //is empty if scope is an object, otherwise it is passed from html attribute
     }
   }

HTML:

<div class="control-group" ng-repeat="x in selectedControls">
  <div create-control="{{ x }}"></div>
</div>

オブジェクトscopeとして定義されている場合attrsは空です。それ以外の場合は、html から渡された値です。

この動作の原因は何ですか? 渡された属性とモデルにアクセスするにはどうすればよいですか?

4

3 に答える 3

3

問題: 親スコープ内でcreate-control評価する必要がありますが、ディレクティブが宣言されているときにオブジェクトを作成することにより、分離スコープが作成されます。これは、にアクセスできないことを意味します。したがって、空です。 {{x}}scopeattrs.createControlx

解決策の 1 つ:これを修正する方法はいくつかありますが、最も良い方法は、ディレクティブを構成しscope.createControlて、属性を介してその分離スコープに受け入れるようにすることです。

作業フィドル: http://jsfiddle.net/pvtpenguin/tABt6/

myApp.directive('createControl', function ($compile, $timeout) {
    return {
        scope: {
            name: '@', // Dynamically created ng-model in the directive element
            createControl: '@'
        },
        link: function (scope, element, attrs) {
            scope.$watch('createControl', function () {
                // the following two statements are equivalent
                console.log(attrs.createControl);
                console.log(scope.createControl);
            })
        }
    }
})
于 2013-05-07T17:43:02.280 に答える
1

Matt に同意しますが、次の 2 つのステートメントは attrs が設定されている場合にのみ同等です。

console.log(attrs.createControl);

console.log(scope.createControl);

それ以外の場合、attrs.createControl未定義にscope.createControlなりますが、関数が定義されます。

于 2013-10-02T22:32:54.087 に答える