我已经使用$ compile服务编译了一个元素。如果我直接将其添加到DOM,它看起来很棒,并且所有绑定都是正确的。如果我希望该元素为字符串,则显示{{stuffHere}}而不是绑定。有没有一种方法可以在元素编译后获取其html?
{{stuffHere}}
$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!
content is Hello, World!
警报显示 <div><div><span ng-binding>{{content}}</span></div></div>
<div><div><span ng-binding>{{content}}</span></div></div>
我想从警报中看到的是 <div><div><span ng-binding>Hello World</span></div></div>
<div><div><span ng-binding>Hello World</span></div></div>
问题是您太早阅读了元素的内容。如果将a添加$timeout到您的阅读中,它将是正确的:
$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 });
更新的柱塞
$compile调用该方法后,它不会立即生效。这是由于$digest循环造成的,因为它使用循环,$scope因此需要运行$digest循环以查看是否有任何影响$scope.content。这就是为什么必须设置a的原因$timeout,需要等到$digest循环完成后才能真正更改元素的内容。您可以在这里阅读更多有关这一切如何联系的信息。
$compile
$digest
$scope
$scope.content