Я знаю, що це давнє запитання, але я розглядав варіанти зробити це нещодавно, тому думав, що я викладу свої висновки тут, на випадок, якщо це комусь корисно.
У більшості випадків, якщо є необхідність взаємодії зовнішнього застарілого коду із станом інтерфейсу користувача або внутрішнім функціонуванням програми, сервіс може бути корисним для усунення цих змін. Якщо зовнішній код безпосередньо взаємодіє з вашим кутовим контролером, компонентом або директивою, ви сильно зв’язуєте додаток зі своїм застарілим кодом, що є поганою новиною.
Що я в кінцевому підсумку використовував у моєму випадку - це комбінація глобальних глобальних мереж (тобто вікон) та обробки подій. Мій код має інтелектуальний механізм генерації форм, який вимагає виходу 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 () {'використовувати строгий';
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 для обертання змін моделі.