2016-08-22 5 views
0

私は$compileを使用して、オンザフライで指令をコンパイルしています。私が知りたいのは、ディレクティブがいつコンパイルされるのを検出して(約束?)、それをDOMに追加できるようにする方法があるかどうかです。私はこのような何かをしたい:

function newMessage() { 
    var directive = $compile("<div select-contacts message=\"newShare\"></div>"); 

    // Compile directive 
    directive($scope).then(function(compiled) { 
     // After compiling, append it somewhere in the DOM 
     angular.element('#new_message').html(compiled); 
    }); 
} 

私は$compileのドキュメントを検索したと私はこのような何かを行う方法には、まだはっきりしていないんだか、それも可能だ場合。ここで

更新

は、私が現在持っているものです。これはローカルホスト上でtimeoutを0に設定して動作しますが、本番環境では50ms以上の遅延を導入すると動作します。私は安全であるために250msを持っていますが、それは恣意的と思われます。

function newMessage() { 
    angular.element('#new_message_container').html($compile("<div select-contacts message=\"newShare\"></div>")($scope)); 
    $timeout(function() { 
     angular.element('#new_message').html(compiled); 
      content: angular.element('#new_message'), 
      elem: angular.element('#new_message_container'), 
      width: '1024px', 
      height: '480px' 
     }); 
    }); 
} 

基本的に私は隠されているコンテナ要素を持っています。私はその指示文をコンパイルして隠れたコンテナの中に置きます。次に、タイムアウトブロック内でモーダルを開き、ルートディレクティブ要素を隠しコンテナからモーダル要素に移動します。これをlocalhostで実行すると動作します。モーダルが開き、ディレクティブはすでにコンパイルされています。本番段階では、タイムアウトブロック内のコードが呼び出される前に、ディレクティブがコンパイル終了していないように見えます。効果は、モーダルが開きますが、空です。 0で$タイムアウトは、すべてのニーズのために十分である、DOMに適用されるように仕上げるとし、コンパイルを待つために

+0

* "タイムアウトブロック内で、ルートディレクティブ要素を隠しコンテナからモーダル要素" *に移動するモーダルを開きます。したがって、基本的に別の "イベント"が待ちますか?その場合は、2つの$タイムアウト呼び出しを使用するか、ディレクティブ – Luxor001

答えて

0

function newMessage() { 
    var directive = $compile("<div select-contacts message=\"newShare\"></div>"); 

    // Compile directive 
    $timeout(function(){ 
     angular.element('#new_message').html(compiled); 
    }, 0); 
} 

タイムアウトを0には、次の時に、あなたの内側の機能を実行します言い換えれば、バインディングが実行された直後(したがって、すべてのdom要素がコンパイルされ、domに注入されます)。

+0

を使用することができます。私はあなたのソリューションを試して、それはローカルホスト上で動作しますが、何らかの理由で本番では動作しません。 – ACIDSTEALTH

関連する問題