在AngularJS中清理脚本

时间:2014-06-14 15:01:57

标签: javascript angularjs

我想尝试使用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,但你有任何想法清理脚本吗?

2 个答案:

答案 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