0

私はテンプレートにaccordion指示文を使用しています。アコーディオンの内側には、要素にattrng-clickを追加しています。その要素をクリックすると、2回発生します。角度指示コンパイラがng-clickを2回起動しました

フィドル:http://jsfiddle.net/Lvc0u55v/10071/

コード:

//accordion directive 
.directive('simpleAccordion', function($compile, $timeout) { 
    return { 
     restrict: 'AEC', 
     controller: function($scope) { 
      $scope.current = null; 
      $scope.height = []; 
      $scope.zero = { 
       height: 0 
      }; 
      $scope.toggle = function(i) { 
       $scope.current = $scope.current === i ? null : i; 
      }; 
     }, 
     link: function(scope, el, attrs) { 
      var itemSelector = '[item-selector]' || 'li', 
       titleSelector = '[title-selector]' || 'h2', 
       contentSelector = '[content-selector]' || 'div'; 
      $timeout(function(){ 
      var items = el[0].querySelectorAll(itemSelector); 
      for (var i in items) { 
       if (angular.isObject(items[i])) { 
       var title = items[i].querySelectorAll(titleSelector)[0]; 
       var content = items[i].querySelectorAll(contentSelector)[0]; 
       scope.height.push({ 
        'height': (content.offsetHeight + 10) + 'px' 
       }); 
       angular.element(items[i]).addClass('item').attr({ 
        'ng-class': '{\'open\':current == ' + i + '}' 
       }); 
       angular.element(title).addClass('title').attr('ng-click', 'toggle(' + i + ')'); 
       angular.element(content).addClass('content').attr({ 
        'ng-style': 'current == ' + i + '?height[' + i + ']:zero' 
       });; 

       } 
      } 
      $compile(angular.element(el).contents())(scope); 
      }); 
     } 
    } 
}) 

フィドル:http://jsfiddle.net/Lvc0u55v/10071/

答えて

0

デフォルトの角度によっては、ます、あなたのディレクティブのすべてのコンテンツをコンパイルし、そうしてあなたはリンク機能でコンパイルを呼び出し、NG-クリック二度コンパイルされる。

これらの現象を防ぐには、ターミナルとプライオリティattrsでコンパイルすることからhtmlを保護し、手動でコンパイルします。

変更ディレクティブの定義に:

{ 
.... 
terminal: true, 
priority: 1000 
... 
} 

と同じようにコンパイル呼び出し:このコードは、なぜおよび/またはどのようにこのコードは、質問はその長いが向上回答に関する追加のコンテキストを提供し、質問に答えるかもしれないが$compile(el, null, 1000);

+3

-term値。 – ryanyuyu

+0

が 'priority'の値である' 1000'は必須であり、そうでない場合は基本と 'priority'値をどのくらい設定できます。 – Amit

+0

各ディレクティブはangleで優先順位があり、デフォルトは0ですが、組み込みディレクティブの中には優先順位が異なるものがあります。より高い優先順位からより低い優先順位への指令のコンパイル。 js番号の制限によって制限されます。 –

関連する問題