react2angularjs
Version:
A fully functional way to integrate React components in Angular 1 apps!
55 lines (44 loc) • 1.41 kB
JavaScript
import React from 'react';
import { render } from 'react-dom';
import createReactElements from './create-react-elements';
export default class ReactDirective {
constructor(ReactComponent, propNames, $compile) {
this.restrict = 'EA';
this.transclude = true;
this.ReactComponent = ReactComponent;
this.propNames = propNames;
this.$compile = $compile;
this.scope = this.getScopeBindings();
}
getScopeBindings() {
return this.propNames.reduce((scope, propName) => {
scope[propName] = `<${propName}`;
return scope;
}, {});
}
getProps(elementScope) {
return this.propNames.reduce((props, propName) => {
props[propName] = elementScope[propName];
return props;
}, {});
}
link(scope, element, attrs, ctrl, transclude) {
const $container = element[0];
const $children = transclude(function() {});
const children = createReactElements($children);
this.render(scope, $container, children);
this.$compile(element.contents())(scope.$parent);
//re render on scope changes
scope.$watchGroup(
Object.keys(scope.$$isolateBindings),
this.render.bind(this, scope, $container, children)
);
}
render(elementScope, $container, children) {
let props = this.getProps(elementScope);
render(
<this.ReactComponent {...props}>{children}</this.ReactComponent>,
$container
);
}
}