angular-multiple-transclusion

1.0.0 • Public • Published

Angular Multiple Transclusion

A concise way to use multiple ng-transclude directives within the same AngularJs template.

Angular Multiple Transclusion extends ng-transclude to add support for multiple transclusion.

<div class="panel panel-default">
  <div class="panel-heading" ng-transclude transclude-from="header">
  </div>
  <div class="panel-body" ng-transclude transclude-from="content">
  </div>
</div>

Demo

http://codepen.io/mcasimir/pen/XbapYd

Install

bower i --save angular-multiple-transclusion

Usage

Example task: Create a myPanel directive transcluding a fragment to the header and a fragment to the body.

Use transclude-from attribute along with ng-transclude directive to define insertion points for transclusion:

angular.module('myApp', ['angular-multiple-transclusion'])
 
.directive('myPanel', function(){
  return {
    restrict: 'E',
    transclude: true,
    template:
      '<div class="panel panel-default">' +
      '    <div class="panel-heading" ng-transclude transclude-from="header">' +
      '    </div>' +
      '    <div class="panel-body" ng-transclude transclude-from="content">' +
      '    </div>' +
      '</div>'
  };
});

Use transclude-to to wire each element to the respective ng-transclude block:

<main ng-app="myApp">
  <my-panel>
    <div transclude-to="header">Hi there!</div>
    <div transclude-to="content">Lorem ipsum dolor sit amet...</div>
  </my-panel>
</main>

Works with isolated scopes

.directive('myDialog', function(){
  return {
    restrict: 'E',
    scope: {
      title: '@'
    },
    transclude: true,
    template:
      '<div class="dialog">' +
      '    <div class="dialog-title">{{title}}</div>' +
      '    <div class="dialog-body" ng-transclude transclude-from="content">' +
      '    </div>' +
      '    <div class="dialog-actions" ng-transclude transclude-from="actions">' +
      '    </div>' +
      '</div>'
  };
});
<main ng-app="myApp" ng-init="title='My Document'">
  <my-dialog title="Save Document">
    <div transclude-to="body">Are you sure?</div>
    <div transclude-to="actions">
      <button>Save {{title}}</button>
    </div>
  </my-dialog>
</main>

Why multiple transclusion rocks?

See how people at OpenTable uses multiple transclusion with angular to create reusable components:

Package Sidebar

Install

npm i angular-multiple-transclusion

Weekly Downloads

3

Version

1.0.0

License

MIT

Last publish

Collaborators

  • mcasimir