Подтвердить что ты не робот

Использование ReactJS с AngularJS

Я пытаюсь использовать ReactJS с AngularJS, но он не работает. Может ли кто-нибудь направить меня на то, как сжечь их вместе? Или, пожалуйста, укажите, что здесь отсутствует?

Мой index.html выглядит следующим образом:

<!DOCTYPE html>
<html data-ng-app="MyApp">
    <head>
        <title>My Test</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body data-ng-controller="Ctrl1">
        <div id="myDiv">
            <button id="btn1" data-ng-click="clickMe()">Click Me</button>
        </div>
        <script src="http://fb.me/react-0.8.0.js"></script>
        <script src="http://fb.me/JSXTransformer-0.8.0.js"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.js"></script>
        <script type="text/jsx" src="reactExample.js"></script>
        <script src="angularExample.js"></script>
    </body>
</html>

Вот как написано мое responseExample.js:

/**
  * @jsx React.DOM
  */
var testMy = React.createClass({
    render: function(){
        return ( <p>Hello</p>)
    }
});

И мой angularExample.js выглядит следующим образом:

var myapp = angular.module('MyApp',[]);
myapp.controller('Ctrl1',['$scope',function($scope){
    $scope.clickMe = function(){
        alert("Clicked!");
        React.renderComponent(testMy, elem[0]);
    }
}]);

Он ничего не отображает (кроме предупреждения). Я ожидаю увидеть "Hello", напечатанный там, но он вызывает следующую ошибку в консоли:

Error: Invariant Violation: prepareEnvironmentForDOM(...): Target container is not a DOM element

Любая помощь будет высоко оценена.

4b9b3361

Ответ 1

Уже @Simon Smith упомянул, почему ошибка occour React.renderComponent ожидает второй аргумент, но способ воспроизведения DOM-манипуляции внутри контроллера не подходит. В AngularJs DOM-манипуляция должна быть в directive. Давайте посмотрим, как это может быть

Из Facebook React vs AngularJS: более внимательный взгляд

Реагирующие компоненты намного мощнее, чем Angular шаблоны; их следует сравнивать с директивами Angular.

Внизу этого блога Используя раздел React и AngularJS, вы можете видеть, как angular и react могут играть вместе.

От веб-сайта отреагировать

Реагирующие компоненты реализуют метод render(), который принимает входные данные и возвращает отображаемые данные.

В AngularJs компоненты отображаются directive

Смотрите plunker, где я интегрирую AngularJs и react.

В react-example.js создайте элемент virtual dom

var Hello = React.createClass({
  render: function() {
    return React.DOM.div({}, 'Hello ' + this.props.name);
  }
});

И директива myMessage визуализирует virtual dom

React.renderComponent(Hello({name: scope.myModel.message}), document.getElementById('example'));

Где свойство virtual dom name будет связываться с scope.myModel.message

Ответ 2

Чтобы использовать React в моем контроллере, я делаю это

 myApp.controller(function($scope){
        $scope.myComponent = {};
        $scope.myComponent.setState({data: "something"});
    });

и в моей компоненте React:

window.myComponent = React.createClass({
    getInitialState: function(){
        return {
           data:''
        }
    },
    componentWillMount: function(){
       var scope = this.props.scope;
           scope.myComponent = this;
    },
    render:func .....
});

Я использую директиву ngReact от Дэвида Чанга, которая передает $scope как свойство в компонент. Итак, теперь вы можете вызывать setState из вашего контроллера, заставляя реагирующий компонент повторно рисовать:)

У меня есть более высокий пример выше в React-Sandbox

Ответ 3

Я бы рассмотрел возможность интеграции с помощью директивы, поскольку это часто рекомендуемый подход для интеграции кода angular angular.

Вот пример:

angular.module('app').directive('greeting',[function(){
    return {
        restrict:'AE',
        scope:{name:'@'},
        link: function (scope, elem, attrs){
            var GreetingSection = React.createClass({displayName: 'Greeting',
                render: function() {
                    var message = "Good morning " + this.props.data.name + ", how are you?";
                    return React.createElement('div', {className: "greeting"},message);
                }
            });
            React.renderComponent(GreetingSection({data:scope}), elem[0]);
        }
    };
}]);

Подробнее здесь: http://www.syntaxsuccess.com/viewarticle/547bbd04fa0710440b45e41c

Ответ 4

renderComponent ожидает, что элемент DOM будет вторым аргументом для ввода компонента. Похоже, это то, о чем жалуется ошибка.

Ответ 5

Вместо этого попробуйте использовать модуль ngReact angular, а не напрямую использовать ReactJs. Это обеспечивает плавную интеграцию с angularJs. Проверьте образцы/примеры @https://github.com/davidchang/ngReact