一尘不染

我可以获取Angular元素的已编译html吗?

angularjs

我已经使用$
compile服务编译了一个元素。如果我直接将其添加到DOM,它看起来很棒,并且所有绑定都是正确的。如果我希望该元素为字符串,则显示{{stuffHere}}而不是绑定。有没有一种方法可以在元素编译后获取其html?

$templateCache.put('template', '<div><div><div><span>content is {{content}}</span></div></div>   </div>');

$scope.content = 'Hello, World!';

var el = $compile($templateCache.get('template'))($scope);
$('body').append(el);

alert(el.html());

http://plnkr.co/edit/1sxvuyUZKbse862PieBa?p=preview

附加到主体的元素显示 content is Hello, World!

警报显示 <div><div><span ng-binding>{{content}}</span></div></div>

我想从警报中看到的是 <div><div><span ng-binding>Hello World</span></div></div>


阅读 281

收藏
2020-07-04

共1个答案

一尘不染

问题是您太早阅读了元素的内容。如果将a添加$timeout到您的阅读中,它将是正确的:

angular.module('demo', []);
angular.module('demo').controller('PopoverDemoCtrl', function($scope, $timeout, $compile, $templateCache) {
  $templateCache.put('template', '<div><div><div><span>content is {{content}}</span></div></div></div>');

  $scope.content = 'Hello, World!';

  var el = $compile($templateCache.get('template'))($scope);
  $('body').append(el);
  $timeout(function() {
    console.log(el.html());
  }, 300);   // wait for a short while
});

更新的柱塞

为什么$timeout需要?

$compile调用该方法后,它不会立即生效。这是由于$digest循环造成的,因为它使用循环,$scope因此需要运行$digest循环以查看是否有任何影响$scope.content。这就是为什么必须设置a的原因$timeout,需要等到$digest循环完成后才能真正更改元素的内容。您可以在这里阅读更多有关这一切如何联系的信息

2020-07-04