在AngularJS指令中绑定html之前修改html的最佳方法
我正在编写一个AngularJS应用程序,它从服务器获取帖子列表,然后使用ngRepeat和自定义post指令输出所有帖子 post对象的一部分是一个html blob,我目前通过首先执行$sce.trustAsHtml(blob),然后使用ng bind html指令并将受信任的html blob传递给它,将其添加到指令中。它工作得很好,但是现在我想在将html添加到输出之前修改它。例如,我想找到所有链接标记并向其添加target=“\u blank”。我还想从任何元素中删除任何内容可编辑属性。等等 这样做的最佳方式是什么?我想把它加载到一个文档片段中,然后递归地遍历所有的子对象,做我需要做的事情。但我想有更好的AngularJS方法来实现这一点 编辑: 下面是一个代码笔,其中有一个示例:在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”。我还想从任何元素中删除任何内容可编辑属性
如果要添加本身就是指令的属性,那么添加它们的最佳位置是在自定义指令的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...
};
});