Это болезненный процесс, но на самом деле выполнимо.Получившееся приложение будет в конечном итоге не поддерживаемым, поэтому я предлагаю вам сделать это только для перехода к рефакторинному приложению React.
Некоторые примеры:
Пример: интеграция angular-bootstrap-datetimepicker
angular
.module('ngApp', ['ui.bootstrap.datetimepicker'])
class AngularWidget extends React.Component {
componentDidMount () {
angular.bootstrap(this.container, ['ngApp']);
}
html = `<datetimepicker data-ng-model="data.date"></datetimepicker>`;
render = () => (
<div
ref={c => this.container = c}
dangerouslySetInnerHTML={{__html: this.html}}
/>
);
}
Пример: взлом маршрутизатора пользовательского интерфейса
componentDidMount() {
angular.module('ngApp')
.run(($state) => {
$state.go = (state, params, options) => {
console.log('hijacked ui router');
}
})
angular.bootstrap(this.container, ['ngApp']);
}
Пример: нейтрализация несанкционированного изменения местоположения Angular
angular.module('ngApp', [])
.config( ['$provide', function ($provide){
$provide.decorator('$browser', ['$delegate', function ($delegate) {
$delegate.onUrlChange = function () {};
$delegate.url = function () { return ""};
return $delegate;
}]);
}]);
Пример: очистить угловое приложение, когда компонент демонтируется
class AngularWidget extends React.Component {
componentDidMount() {
this.$rootScope = angular.injector(['ng', 'ngApp']).get('$rootScope');
angular.bootstrap(this.container, ['ngApp']);
}
componentWillUnmount() {
this.$rootScope.$destroy();
}
render = () => (
<div
ref={c => { this.container = c; }}
dangerouslySetInnerHTML={{ __html: '<widget></widget>' }}
/>
)
}
Ссылка: https://medium.com/appifycanada/angular-components-in-react-2c929130f995