JSFiddle - React, Tailwind, and code Playground
HTML
<div ng-app="app">
<parent-component></parent-component>
</div>
CSS
</style>
<script src="//code.angularjs.org/1.3.0/angular.min.js"></script>
<style>
* {
box-sizing: border-box;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
font: 300 14px/1.4 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
body { background: #eee; margin: 0; padding: 25px; }
JavaScript
(function () {
var ng = angular.module;
function identifierForController(controller, ident) {
if (ident && typeof ident === 'string') return ident;
if (typeof controller === 'string') {
var match = /^(\S+)(\s+as\s+(\w+))?$/.exec(controller);
if (match) return match[3];
}
}
function module() {
var hijacked = ng.apply(this, arguments);
if (hijacked.component) {
return hijacked;
}
function component(name, options) {
function factory($injector) {
function makeInjectable(fn) {
var closure;
var isArray = angular.isArray(fn);
if (angular.isFunction(fn) || isArray) {
return function (tElement, tAttrs) {
return $injector.invoke((isArray ? fn : [
'$element',
'$attrs',
fn
]), this, {
$element: tElement,
$attrs: tAttrs
});
};
} else {
return fn;
}
}
var oneWayQueue = [];
function parseBindings(bindings) {
var newBindings = {};
for (var prop in bindings) {
var binding = bindings[prop];
if (binding.charAt(0) === '<') {
var attr = binding.substring(1);
oneWayQueue.unshift({
local: prop,
attr: attr === '' ? prop : attr
});
} else {
newBindings[prop] = binding;
}
}
return newBindings;
}
var modifiedBindings = parseBindings(options.bindings);
var requires = [name];
var ctrlNames = [];
if (angular.isObject(options.require)) {
for (var prop in options.require) {
requires.push(options.require[prop]);
ctrlNames.push(prop);
}
}
return {
controller: options.controller || angular.noop,
...