2017-01-26 2 views
0

動的に生成されたスパンにng-clickディレクティブを追加する必要があります。スパンは選択したテキストをラップします。ng-clickを動的に追加する方法

range = window.getSelection().getRangeAt(0); 
var span = document.createElement("span"); 
$(span) .addClass("comment") 
      .attr("id", short_id +"_"+ n_comment) 
      .attr("ng-click", "showComment()") 
      .append(range.extractContents()); 
range.insertNode(span); 

上記のコードは、選択を取得し、スパンでそれをラップしますが、ng-clickは動作しません。
角度指示は動的に生成されるので、$compileでコンパイルする必要がありますが、この場合はコンパイルの実行方法がわかりません。

どうすれば解決できますか?皆さん、ありがとうございました。

+0

は、そのような広い説明では機能しません。ブラウザのコンソールでエラーが発生しますか(スパンのレンダリング中か実際にクリックしたとき)イベントを「旧式」なものにすることを止めているのは何ですか? – Icepickle

+0

私はコンソールにエラーがありません(レンダリング中もクリックしても)。問題がコンパイルに関係していると私は確信しています。 '$ compile'を使わないと、ng-clickは角度指示の代わりに単純なhtmlとみなされます。しかし、私の質問は、この場合に '$ compile'を使う方法ですか? – Alessio

+0

うれしかったですが、これを達成するためのより簡単な方法があります。 jQueryとAngularを混在させているようです。 – dwbartz

答えて

1

私はこのコードで私自身のことで解決:

range = window.getSelection().getRangeAt(0); 
var span = document.createElement("span"); 
$(span) .addClass("comment") 
      .attr("id", short_id +"_"+ n_comment) 
      .attr("ng-click", "showComment()") 
      .append(range.extractContents()); 
range.insertNode(span); 
getScope(span); 

と機能getScope

function getScope(el){ 
    var $scope = angular.element(el).scope(); 
    $scope.view(el); 
} 

私はスパンの範囲を取得する。このように、と私はコンパイルview()機能で動的に生成されるhtml:

$scope.view = function(element){ 
    $compile(element)($scope); 
} 

要素をコンパイルした後、ng-clic k作品。 ありがとうございます。

+1

どうして角度を使用していますか?この種の目的を破ると、jqueryを使う方が良いでしょう。 – Patrick

+0

'$(element).click(function(){});を使うことを意味するなら、あなたは正しいですが大きなアプリケーションがあり、clickイベントのためには常に' ng-click'を使います。アプリケーション全体のパターンに従うように角度をつけます。 – Alessio

関連する問題