Я знаю, что это старый вопрос, но я недавно искал варианты сделать это, поэтому я решил поместить свои выводы здесь на тот случай, если они кому-нибудь пригодятся.
В большинстве случаев, если существует потребность во внешнем унаследованном коде для взаимодействия с состоянием пользовательского интерфейса или внутренней работой приложения, служба может быть полезна для отвлечения этих изменений. Если внешний код взаимодействует напрямую с вашим угловым контроллером, компонентом или директивой, вы сильно связываете свое приложение с унаследованным кодом, что является плохой новостью.
В моем случае я использовал комбинацию глобальных переменных, доступных в браузере (например, окна) и обработки событий. Мой код имеет интеллектуальный механизм генерации форм, который требует вывода JSON из CMS для инициализации форм. Вот что я сделал:
function FormSchemaService(DOM) {
var conf = DOM.conf;
// This event is the point of integration from Legacy Code
DOM.addEventListener('register-schema', function (e) {
registerSchema(DOM.conf);
}, false);
// service logic continues ....
Форма службы формы создается с использованием углового инжектора, как и ожидалось:
angular.module('myApp.services').
service('FormSchemaService', ['$window' , FormSchemaService ])
И в моих контроллерах: function () {'use strict';
angular.module('myApp').controller('MyController', MyController);
MyEncapsulatorController.$inject = ['$scope', 'FormSchemaService'];
function MyController($scope, formSchemaService) {
// using the already configured formSchemaService
formSchemaService.buildForm();
Пока что это чисто угловое и JavaScript-сервис-ориентированное программирование. Но унаследованная интеграция приходит сюда:
<script type="text/javascript">
(function(app){
var conf = app.conf = {
'fields': {
'field1: { // field configuration }
}
} ;
app.dispatchEvent(new Event('register-schema'));
})(window);
</script>
Очевидно, что у каждого подхода есть свои достоинства и недостатки. Преимущества и использование этого подхода зависят от вашего пользовательского интерфейса. Предложенные ранее подходы не работают в моем случае, так как моя схема формы и унаследованный код не контролируют и не знают угловых областей. Следовательно, настройка моего приложения на основеangular.element('element-X').scope();
может потенциально сломать приложение, если мы изменим границы. Но если ваше приложение знает об объеме и может полагаться на то, что оно не меняется часто, то, что было предложено ранее, является жизнеспособным подходом.
Надеюсь это поможет. Любые отзывы также приветствуются.
var injector = angular.injector(['ng', 'MyApp']);
. Это даст вам совершенно новый контекст и дубликатmyService
. Это означает, что вы получите два экземпляра сервиса и модели и будете добавлять данные в неправильное место. Вместо этого вы должны использовать целевой элемент в приложении, используяangular.element('#ng-app').injector(['ng', 'MyApp'])
. На этом этапе вы можете использовать $ apply для переноса изменений модели.