javascript - 带有 ng-transclude 的指令将 html 包装在 ng-transclude 元素中

标签 javascript angularjs

我在模板中有一个带有 ng-repeat 的指令,但我还想在中继器后面有一个 ng-transinclude 以允许用户插入自己的内容。问题是自定义内容在渲染时被包装在 ng-transclude 元素中,而我不希望这样。

指令:

    angular.module("MyModule", [])
  .directive('myDirective', [function () {
    return {
      restrict: 'EA',
      transclude: true,
      replace: true,
      scope: {},
      templateUrl: 'templates/template_view.html',
      link: function (scope, element, attrs) { 
        scope.nodes = [
          {
            "imageSource": "",
            "title": "Sample Title",
            "body": "Lorem ipsum and some other stuffs",
            "readMore": "",
            "date": "Mar 20"
          }
        ];

      }
    };
  }]);

模板:

<section>
  <div class="someClass" ng-repeat="node in nodes">
    <div>
      <img src="{{node.imageSource}}" alt="Picture">
    </div>
    <div class="content bounce-in">
      <h2>{{node.title}}</h2>
      <p>{{node.body}}</p>
      <a href="{{node.readMore}}" ng-show="{{node.readMore}}">Read more</a>
      <span>{{node.date}}</span>
    </div>
  </div>
  <div ng-transclude></div>
</section>

用途:

<div my-directive>
  <div class="someClass">
    <h2>Title of section 1</h2>
    <p>Lorem ipsum dolor </p>
    <span class="cd-date">Jan 14</span>
  </div>
  <div class="someClass">
    <h2>Title of section 2</h2>
    <p>Lorem ipsum dolor</p>
    <span class="cd-date">Jan 18</span>
  </div>
</div>

输出内容:

<section my-directive="">
  <!-- ngRepeat: node in nodes -->
  <div class="someClass" ng-repeat="node in nodes">
    <div>
      <img src="" alt="Picture">
    </div>

    <div class="content bounce-in">
      <h2>Sample Title</h2>
      <p>Lorem ipsum and some other stuffs</p>
      <a href="" ng-show="">Read more</a>
      <span>Mar 20</span>
    </div>
  </div>
  <!-- end ngRepeat: node in nodes -->
  <div ng-transclude="">
    <div class="someClass">
      <h2>Title of section 1</h2>
      <p>Lorem ipsum dolor</p>
      <span class="cd-date">Jan 14</span>
    </div>
  </div>
  <div class="someClass">
    <h2>Title of section 2</h2>
    <p>Lorem ipsum dolor </p>
    <span class="cd-date">Jan 18</span>
  </div>
  </div>

  </div>
</section>

我不想要<div ng-transclude>包装嵌入数据的元素。

最佳答案

您可以使用传递给指令的 comtrollerlink 函数的 transinclude 函数(在您的情况下,link 函数,无论如何这是更推荐的方法)Angular docs .
您将获得嵌入内容的克隆,您可以用它做任何您想做的事情:

angular.module("MyModule", [])
  .directive('myDirective', [function () {
    return {
      restrict: 'EA',
      transclude: true,
      replace: true,
      scope: {},
      templateUrl: 'templates/template_view.html',
      link: function (scope, element, attrs, ctrls, transcludeFn) { 
        scope.nodes = [
          {
            "imageSource": "",
            "title": "Sample Title",
            "body": "Lorem ipsum and some other stuffs",
            "readMore": "",
            "date": "Mar 20"
          }
        ];
        
        transcludeFn(function (clone) {
          element.find('a-selector-for-the-ng-translude-element').after(clone).remove();
        });

      }
    };
  }]);

尚未测试以上代码...

此外,请重新考虑使用 replace: true,因为它自 Angular 1.3 起已被弃用

关于javascript - 带有 ng-transclude 的指令将 html 包装在 ng-transclude 元素中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29282491/

相关文章:

javascript - 使用复选框列表中的 jquery 追加文本

javascript - 根据 Laravel 中的状态显示人员目录

javascript - Angular .js :11706 TypeError: k is not a function

angularjs - 如何像在 jQuery 中一样在 AngularJS 中触发事件?

javascript - 每当输入模糊时在链接指令内进行检测

javascript - 如果 else 失败,则嵌套后 else 不起作用

javascript - 动画jquery只工作一次

javascript - solid-js中如何只监听某个对象的某个值?

javascript - 在 bootstrap timepicker-angular js 中验证

javascript - 从 javascript 中访问 firebaseUser 'created' 时间戳