0

ng-repeat および ng-bind-html 内で機能する ng-click ディレクティブを取得しようとしています。ng-click コードは、サーバーからプルされたデータから html の文字列に追加されます (したがって ng-bind-html)。セットアップには、コントローラー、Drupal を使用してページに配置される基本テンプレート、および Drupal からテンプレートを介して読み込まれる部分テンプレートがあります。

現時点では、コントローラーは次のようになります。

var guideListController = angular.module('app')
  .controller('guideListController', [
    '$scope',
    '$sce',
    '$compile',
    'ViewService',
    'ToolKit',
  function($scope, $sce, $compile, ViewService, ToolKit) {

  // Storage for which rows need more/less links
  this.rowIndex = [];

  this.showFull = false;
  this.showFullClick = function() {
    alert('Showfull');
  };

  this.trustIntro = function(code) {
    return $sce.trustAsHtml(code);
  };

  // Fetch the guide list view from services
  var data = ViewService.get({view_endpoint:'guide-service', view_path: 'guide-list'}, function(data) {
    //console.log(data);

    // Update/process results 
    for (var row in data.results) {

      // Create short intro w/ truncate.js
      data.results[row].Intro_short = $sce.trustAsHtml($scope.guideList.getShortIntro(data.results[row], row));
      //data.results[row].Intro_short = $scope.guideList.getShortIntro(data.results[row], row);

      // Update intro
      data.results[row].Introduction = $sce.trustAsHtml($scope.guideList.updateIntro(data.results[row], row));
      //data.results[row].Introduction = $scope.guideList.updateIntro(data.results[row], row);

    }
    $scope.guideList.guides = data.results;
  });


  // Add a read less anchor tag at the end of the main intro
  this.updateIntro = function(row, row_index) {
    var intro = row['Introduction'].trim();

    if ($scope.guideList.rowIndex[row_index]) { // only apply Less link if needed
      var index = intro.length - 1;
      var tag = [];
      if (intro.charAt(index) === '>') { // we have a tag at the end
        index--;
        do {
          tag.push(intro.charAt(index));
          index--;
        } while (intro.charAt(index) != '/'); // the closing tag
        index--; // we move the index one more for the "<"
        tag.reverse(); // Reverse
        tag = tag.join('');
      }

      var inserts = ['div', 'p']; // we insert the Less link here.
      if (jQuery.inArray(tag, inserts) >= 0) { // insert into the tag
        intro = intro.substr(0, index) + ' <a class="less" ng-click="$parent.guideList.showFull = false">Less</a>' + intro.substr(index);
      }
      else { // insert at the end of the html
        intro = intro + '<a class="less" ng-click="this.showFull = false">Less</a>';
      }
    }

    return intro; 
  };


  // Truncate the long intro into a shorter length blurb
  this.getShortIntro = function(row, row_index) {
    // Truncate if necc.
    var short_intro = jQuery.truncate(row['Introduction'], {
      length: 250,
      words: true,
      ellipsis: '\u2026 <a class="more moreish" attr-ng-click="guideList.showFullClick()">Read&nbsp;on</a>'
    });

    var more = jQuery('.more', short_intro); // select more link

    if (more.length) { // do we have a more link
      $scope.guideList.rowIndex[row_index] = true;
    }
    else { // no more link
      $scope.guideList.rowIndex[row_index] = false;
    }
    $compile(short_intro)($scope);
    return short_intro;
  };
}]);

ViewService.get() 呼び出しでわかるように、データがフェッチされてから処理されます。処理は、クリックできるように意図された「イントロ」フィールドの最後にリンクを配置するだけです。

しばらくの間、ng-click ディレクティブを表示することさえ困難でした ($sce.trustAsHtml なしで除外されていました)。現在はそこにありますが、クリックしても効果がありません。

メイン テンプレート (Drupal から) は現在次のようになっています。

<div class="guide-listing" ng-controller="guideListController as guideList">
  <a ng-click="guideList.showFullClick()">Click me</a>
  <div class="guide-teaser" 
       ng-repeat="guide in guideList.guides"
       ng-include src="'/sites/all/themes/ngTheme/ngApp/partials/guide_teaser.html'">
       <!-- See guide_teaser.html partial for guide teasers -->
  </div>
</div>

上記の Drupal テンプレートに配置されている ng-click は、期待どおりに機能します。

ng-repeat で使用されるパーシャルは、次のようになります。

<div ng-controller="guideListController as guideList">
  <h2 class="guide-teaser-title"><a href="{{guide.path}}">{{guide.node_title}}</a></h2>
  <div class="guide-teaser-intro" ng-bind-html="guide.Introduction" ng-show="guide.showFull">
    {{guide.Introduction}}
  </div>
  <div class="guide-teaser-intro-short" ng-bind-html="guide.Intro_short" ng-show="!guide.showFull">
    {{guide.Intro_short}}
  </div>
</div>

これまでのところ、ng-click を short_intro で機能させることに取り組んできただけで、これまでのところ成功していません。私が間違っていることについてのアイデアは大歓迎です!

4

1 に答える 1

0

わかりました、だから私はいくつかの牽引力を得ました! https://github.com/francisbouvierによって作成された ngHtmlCompile ( http://ngmodules.org/modules/ng-html-compile ) ディレクティブを使用しました(ありがとう!)

問題は、新しい (動的) html がコンパイルされていないことでした。

最初はうまくいきませんでした。起動を妨げる2つの問題がありました:

A: $sce.trustAsHtml の使用をやめました。これをディレクティブと組み合わせて使用​​すると、コンテンツが消えてしまいました!

B: もう 1 つの問題は範囲の問題でした。Transclude が false に設定されるようにディレクティブを変更した後、問題なく動作しました!

于 2015-06-12T17:59:17.800 に答える