我正在尝试编写将给定模板和作用域呈现为字符串的服务。

这是代码:

utilModule.factory('CompilerService', ['$compile', '$templateCache',
    function ($compile, $templateCache) {
        return {
            renderTemplateToString: function(templateName, scope) {
                var template = $templateCache.get(templateName);
                var linkFn = $compile(template);
                var linkedContent = linkFn(scope);
                scope.$apply();

                return linkedContent.html();
            }
        }
    }]);

但是,当我调用此函数时,由于调用$ apply()导致出现 Angular InProg错误:

https://docs.angularjs.org/error/$rootScope/inprog

我在调用$ apply()以便在检索html之前在模板内替换变量。

关于如何在没有InProg错误的情况下实现此目标的任何想法?

最佳答案

您有两种选择:

if ( !scope.$$phase )
    scope.$apply();

这是检查代码是否在$ digest周期内执行。

但是,首选$timeout:
$timeout( function(){
  var template = $templateCache.get(templateName);
                var linkFn = $compile(template);
                var linkedContent = linkFn(scope);
}, 0)

编辑:要使用前提,您应该执行以下操作:
    renderTemplateToString: function(templateName, scope) {
            var deferred = $q.defer();
            $timeout(function(){
               var template = $templateCache.get(templateName);
               var linkFn = $compile(template);
               var linkedContent = linkFn(scope);
               scope.$apply();
               deferred.resolve( linkedContent.html() );
            }, 0);

            return deferred.promise;
    }

$ timeout在执行之前等待$digest完成

关于javascript - 如何在不引起InProg错误的情况下将AngularJS模板呈现为字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27035690/

10-11 02:31