我想尝试使用AngularJS中的$ sce来清理脚本。
//控制器
angular.module('App')
.controller('SketchCtrl', function ($scope, $location, $sce , http) {
$scope.init = function () {
var sketchId = $location.path().split("/:").pop();
http.getSketch(sketchId);
}
$scope.sanitize = function (script) {
if(script){
return $sce.trustAsJs(script);
}
}
});
//查看
<script ng-bind="sanitize('{Here is a script I want to sanitize}}')"></script>
但是我收到了这样的错误。
Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
我知道如何清理html,但你有任何想法清理脚本吗?
答案 0 :(得分:2)
当您在属性上创建更改循环时,通常会出现您提到的错误。例如,当您监视某个属性的更改,然后在侦听器上更改该属性的值时。你不应该在渲染过程中改变对象/模型,否则会强制进行新的渲染。
答案 1 :(得分:0)
要添加到现有答案,
简化,$sce.trustAsJs
通知AngularJS $rootScope
某些内容可能已更改,这很可能导致ng-bind
重新评估表达式,表达式正在调用sanitize
并且调用$sce.trustAsJs
导致这种情况一次又一次地发生,直到达到它停止的极限,因为某些东西似乎出错了。
通常,除非他们做的事情非常简单,否则不要将函数调用放在html绑定中。您可以避免遇到的问题的方法是ng-bind
仅在范围摘要链之外更新的变量。
你可以在这里做的是添加ng-init
,我们知道只运行一次,设置一个变量,然后让ng-bind
引用它;
<script ng-init="script = sanitize('{Here is a script I want to sanitize}}')"
ng-bind="script"></script>
您也可以在控制器中设置上述示例中的script
,只需确保只在sanitize
更改或初始化时调用script
。
此外,如果你相信任意JS你想要运行你,也可以保持简单并使用eval
。