在AngularJS指令中绑定html之前修改html的最佳方法

在AngularJS指令中绑定html之前修改html的最佳方法,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我正在编写一个AngularJS应用程序,它从服务器获取帖子列表,然后使用ngRepeat和自定义post指令输出所有帖子 post对象的一部分是一个html blob,我目前通过首先执行$sce.trustAsHtml(blob),然后使用ng bind html指令并将受信任的html blob传递给它,将其添加到指令中。它工作得很好,但是现在我想在将html添加到输出之前修改它。例如,我想找到所有链接标记并向其添加target=“\u blank”。我还想从任何元素中删除任何内容可编辑属性

我正在编写一个AngularJS应用程序,它从服务器获取帖子列表,然后使用ngRepeat和自定义post指令输出所有帖子

post对象的一部分是一个html blob,我目前通过首先执行$sce.trustAsHtml(blob),然后使用ng bind html指令并将受信任的html blob传递给它,将其添加到指令中。它工作得很好,但是现在我想在将html添加到输出之前修改它。例如,我想找到所有链接标记并向其添加target=“\u blank”。我还想从任何元素中删除任何内容可编辑属性。等等

这样做的最佳方式是什么?我想把它加载到一个文档片段中,然后递归地遍历所有的子对象,做我需要做的事情。但我想有更好的AngularJS方法来实现这一点

编辑:

下面是一个代码笔,其中有一个示例:

如果要添加本身就是指令的属性,那么添加它们的最佳位置是在自定义指令的compile函数中

如果它们只是普通的旧属性,那么在run块中连接到DOM ready并使用jquery添加属性并没有什么错

var app = app.module('app',[]);
app.run(function ($rootScope){
       $(document).ready(function()
                $rootScope.$apply(function(){
                       $('a').attr('title','cool');
                 });
       })
});
如果要在编译阶段之后、角度生命周期中的链接阶段之前添加属性,那么最好在控制器函数中添加放置在body元素上的指令

  <body ng-controller="bodyCtrl">
  </body>

   app.controller('bodyCtrl', function($element){
           $('a', $element).attr('title','cool');
   });

应用控制器('bodyCtrl',函数($element){
$('a',$element).attr('title','cool');
});

在编译阶段,angular将遍历DOM树,将元素与指令匹配,并沿途转换HTML。在链接阶段,指令通常会设置监视处理程序,以便在模型更改时更新视图。通过在body元素上放置一个指令,可以确保所有指令都已编译,但链接阶段尚未开始

您可以创建一个
过滤器
并通过该过滤器(
|
)导入您的内容。比如:

您的
myCleanupFilter
看起来像这样(未测试):


我听说过滤器可能很慢,所以如果可以的话,我宁愿远离它们。过度使用过滤器不是一个好主意。如果您总是要做这种清理,我宁愿在您从服务器、服务(或ngResource factory)中获取数据后立即进行清理……这就是我实际上想要做的。我目前有一个使用jQuery的非角度应用程序,我使用一堆jQuery选择器获取数据,然后在将其放入我的把手模板之前对其进行编辑。现在我正试图将其转换为AngularJS,我知道Angular有jQueryLite,但它似乎没有所有的选择器,我还想知道是否有比使用jQueryLite(或加载完整的jQuery)更具角度的方法来实现这一点。。我在更靠近数据源的地方添加了清理代码(只要您从$http获得它)。。。检查
.map
数组函数。不过,清理代码非常简单,只是为了演示。这样你只需要清理一次。顺便说一句,你实际上可以将清理方法编码为angular
.filter
,并将其注入到获取数据的服务中。过滤器不仅在视图中使用……我编辑了我的问题,以提供我想要的示例。我想你可能已经找到了答案……但是如果你能在这个问题上进一步阐述,那就太好了……我想我仍然遗漏了一些东西。
angular.module('myApp').filter('myCleanupFilter', function () {
  return function cleanup (content) {
    content.replace('......') // write your cleanup logic here...
  };
});