mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-04-03 23:10:31 +00:00
jQuery's elem.html('') is way slower than elem.empty(). As clearing
element contents happens quite often in certain scenarios, switching
to using .empty() provides a significant performance boost when using
Angular with jQuery.
Closes #4457
76 lines
2.5 KiB
JavaScript
76 lines
2.5 KiB
JavaScript
'use strict';
|
|
|
|
/**
|
|
* @ngdoc directive
|
|
* @name ng.directive:ngTransclude
|
|
* @restrict AC
|
|
*
|
|
* @description
|
|
* Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion.
|
|
*
|
|
* Any existing content of the element that this directive is placed on will be removed before the transcluded content is inserted.
|
|
*
|
|
* @element ANY
|
|
*
|
|
* @example
|
|
<doc:example module="transclude">
|
|
<doc:source>
|
|
<script>
|
|
function Ctrl($scope) {
|
|
$scope.title = 'Lorem Ipsum';
|
|
$scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';
|
|
}
|
|
|
|
angular.module('transclude', [])
|
|
.directive('pane', function(){
|
|
return {
|
|
restrict: 'E',
|
|
transclude: true,
|
|
scope: { title:'@' },
|
|
template: '<div style="border: 1px solid black;">' +
|
|
'<div style="background-color: gray">{{title}}</div>' +
|
|
'<div ng-transclude></div>' +
|
|
'</div>'
|
|
};
|
|
});
|
|
</script>
|
|
<div ng-controller="Ctrl">
|
|
<input ng-model="title"><br>
|
|
<textarea ng-model="text"></textarea> <br/>
|
|
<pane title="{{title}}">{{text}}</pane>
|
|
</div>
|
|
</doc:source>
|
|
<doc:scenario>
|
|
it('should have transcluded', function() {
|
|
input('title').enter('TITLE');
|
|
input('text').enter('TEXT');
|
|
expect(binding('title')).toEqual('TITLE');
|
|
expect(binding('text')).toEqual('TEXT');
|
|
});
|
|
</doc:scenario>
|
|
</doc:example>
|
|
*
|
|
*/
|
|
var ngTranscludeDirective = ngDirective({
|
|
controller: ['$element', '$transclude', function($element, $transclude) {
|
|
if (!$transclude) {
|
|
throw minErr('ngTransclude')('orphan',
|
|
'Illegal use of ngTransclude directive in the template! ' +
|
|
'No parent directive that requires a transclusion found. ' +
|
|
'Element: {0}',
|
|
startingTag($element));
|
|
}
|
|
|
|
// remember the transclusion fn but call it during linking so that we don't process transclusion before directives on
|
|
// the parent element even when the transclusion replaces the current element. (we can't use priority here because
|
|
// that applies only to compile fns and not controllers
|
|
this.$transclude = $transclude;
|
|
}],
|
|
|
|
link: function($scope, $element, $attrs, controller) {
|
|
controller.$transclude(function(clone) {
|
|
$element.empty();
|
|
$element.append(clone);
|
|
});
|
|
}
|
|
});
|