2017-01-24 8 views
2

Angularjsでいくつかの奇妙な動作が見つかりました。私の指示は単に私のdom要素にng-repeatを追加してコンパイルします。ただし、スコープ変数itemにはアクセスできません。説明は以下のコードを見てください。これを把握するために、いくつかのAngularjsスキルを持っているAngularjs:ng-repeatを動的にコンパイルします。

var demo = angular.module('demo', []); 
 
demo.directive('customRepeat', function($compile) { 
 
    return { 
 
     priority: 2000, 
 
     restrict: 'A', 
 
     compile: function(element){ 
 
     element.attr('ng-repeat', 'item in [1,2,3,4,5,6]') 
 
      
 
     return function(scope, element) { 
 
      $compile(element)(scope) 
 
     } 
 
     } 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script> 
 
<div ng-app='demo'> 
 
    <h3>My Items</h3> 
 
    <div custom-repeat> 
 
     Item: {{item}} 
 
    </div> 
 
</div>

N.B.古いバージョンのAngularjs(1.2.xなど)でこれを試してみてください。意図したとおりに動作することがわかります。

答えて

1

生DOMが変更されたときにコンパイルする正しい方法は、var compileFn = $compile(element)のようなディレクティブコンパイル関数からcompileFnを作成し、次にscopeという好きなリンク関数リコンパイル要素のように作成します。そうすれば、角度1.2.X & 1.6.Xバージョンの両方でMaximum call stack exceed errorが表示されます。コンソールを開いてthis plunkerを確認してください。

基本的に何が起こっすると、再びcustomDirectiveのコンパイルにつながる、とこのプロセスは無限に起こっ続けるであろう、もう一度その要素を再コンパイルディレクティブ要素&にng-repeatを追加している、です。したがって、要素をもう一度コンパイルする前に、custom-reportディレクティブ属性を削除したことを確認する必要があります。それはcustom-report無限の実行に許可されません。

var demo = angular.module('demo', []); 
demo.directive('customRepeat', function($compile) { 
    return { 
     priority: 2000, 
     restrict: 'A', 
     compile: function(element){ 
     element.attr('ng-repeat', 'item in [1,2,3,4,5,6]') 
     element.removeAttr('custom-repeat'); 
     //this line is need for compilation of element 
     var compile = $compile(element); 
     return function(scope, element) { 
      compile(scope); //linking scope 
     } 
     } 
    } 
}); 

Plunker Demo

+0

たぶん私は明確ではありませんでした。コードを実行すると、 '{{item}}'が束縛されていないことがわかります。それは 'Item 1'、' Item 2'などと言わなければなりません。それはどんな種類のエラーもスローしません。 – Tympanix

+0

私が気づいたように、{{item}}の後に空の式 '{{}} 'を追加することで、問題が一瞬修正されます。確かにバグのようだ。 – Tympanix

+0

@Tympanix私の更新された回答をplunkerデモで確認してください..今、その明確な希望を.. –

関連する問題