2016-12-13 3 views
0

からNG-クリックで動的コンテンツを注入し、動的なHTMLコンテンツを挿入しながら、それらをマッピングする(それが正しく表示され動作します):私は話題のカップルを検索 は角度、私はオブジェクトの配列を持つコントローラ

this.arr.map(function(val) { 
     val.about = val.about.substring(0,150) + " <span ng-click='showMoreInfo()' class='show-more-info'>...more</span>"; 
    }); 

次のようにsthを実行しようとしました:

var element = angular.element(document.querySelector('.show-more-info')); 
    element.bind('click', $scope.showMoreInfo); 

showMoreInfo()はアラートを表示するだけです。

どうすればこの作品を作成できますか?あなたは、パラメータとしてクリックメソッドを介してすべての情報を送信することができたヴァルスアレイと$ scope.trim機能をトリムAN showMoreInfo

<span ng-repeat="val in vals" ng-click='showMoreInfo()' class='show-more-info'>{{trim(val)}}</span> 

答えて

0

、あなたは単にこれを行うことができます。代わりにこれを試してください。

this.arr.map(function(val) { 
     var abt = val.about; 
     val.about = val.about.substring(0,150) + " <span ng-click='showMoreInfo('"+ abt +"')' class='show-more-info'>...more</span>"; 
    }); 

Clickメソッド

$scope.showMoreInfo = function (about) { 
    alert(about); 
} 
+0

それは何かをトリミングすることではありません。私はJSONファイルを持っていて、キーの1つに本当に長い文字列が含まれています。だから私はその一部(部分文字列)を取り、テキストを拡大するクリック可能なスパンを追加したい。私はテンプレートでそれを行うことはできません、それはコントローラから動的に移動する必要がありますバインディングは動作しません – Shepherd

0

を自分のものを実行します。代わりに、注射のHTML

+0

それはそうではありません。場合は、クリックイベントが発生しないことです。 – Shepherd

+0

ああ、あなたはclickメソッドに情報を送ることに問題があると思った。あなたがそれを行うことができる他の方法があります。テーブル行でng-repeatを使用し、そのようにする代わりに行にng-clickを置くだけです。 – digit

+0

Btw、あなたはその方法を主張している場合、私はそれが新しいdom要素をコンパイルするために、角度指示を使用する必要がある場合より複雑だと思う。私はこのリンクを参照してください - > [リンク](http://stackoverflow.com/questions/19267979/ng-click-not-working-from-dynamically-generated-html) – digit

0

NGクリックディレクティブがコンパイルされていないので、あなたの角度は、それを全く気付いていない(= "showMoreInfo()は、" 発射されていないがNGクリック)ので、クリックの振る舞いは決して発せられません。

角度指示で動的コンテンツを重視する場合は、$compile serviceを読んでみたいです。

Here's a plunkr $ compileを示し、コードが機能しない理由を示します。

ここにデモ隊のスクリプトがあります。 "win"ディレクティブはDOMへの変更を正しく処理し、 "fail"ディレクティブは正しく処理しません。さておき、一般的に、コントローラからDOM操作を実行するためにbad practice考えられているよう

app = angular.module("app", []) 
    .controller("myController",function($scope) { 
    $scope.showMoreInfo = function() { 
      alert("Win Moar!"); 
     } 
    }) 
    .directive("win", ['$compile', function($compile) { 
    return { 
     restrict: "E", 
     scope: { 
     appendToId: "@", 
     }, 
     template: "<button ng-click='click()'>ng-click's Inserted From Here Wins!</button>", 
     link: function(scope, elem, attrs) { 
     scope.click = function() { 
      let target = angular.element(document.querySelector("#" + scope.appendToId)), 
      content = target.html() 
      ; 
      content += ("<p><span ng-click='showMoreInfo()' class='show-more-info'>...more</span></p>"); 
      target.html(content); 
      /** 
      * The $compile service compiles an HTML string or DOM into a 
      * template and produces a template function, 
      * which can then be used to link scope and the template together. 
      * 
      * Because the html of target is compiled it's directives are going 
      * to get compiled, namely ng-click='showMoreInfo()' 
      * 
      * Note the passing target.scope() instead of scope... 
      */ 
      $compile(target)(target.scope()); 
     } 
     } 
    } 
    }]).directive("fail", function() { 
    return { 
     restrict: "E", 
     scope: { 
     appendToId: "@", 
     }, 
     template: "<button ng-click='click()'>ng-click's Inserted From Here Fail :(</button>", 
     link: function(scope, elem, attrs) { 
     scope.click = function() { 
      let target = angular.element(document.querySelector("#" + scope.appendToId)), 
      content = target.html() 
      ; 
      content += ("<p><span ng-click='showMoreInfo()' class='show-more-info'>...more</span></p>"); 
      /** 
      * Changing the DOM doesn't cause angular to process changes 
      * e.g. compile directives like ng-click so the ng-click in 
      * the content doesn't work. 
      */ 
      target.html(content); 
     } 
     } 
    } 
    }) 

関連する問題