Wiem, że to stare pytanie, ale ostatnio szukałem opcji, aby to zrobić, więc pomyślałem, że umieściłem tutaj moje odkrycia na wypadek, gdyby były przydatne dla każdego.
W większości przypadków, jeśli istnieje potrzeba, aby zewnętrzny starszy kod współdziałał ze stanem interfejsu użytkownika lub wewnętrznym działaniem aplikacji, usługa może być przydatna do usunięcia tych zmian. Jeśli zewnętrzny kod oddziałuje bezpośrednio z kontrolerem kątowym, komponentem lub dyrektywą, mocno łączysz swoją aplikację ze starszym kodem, co jest złą wiadomością.
W moim przypadku użyłem kombinacji globali dostępnych w przeglądarce (tj. Okna) i obsługi zdarzeń. Mój kod ma inteligentny silnik generowania formularzy, który wymaga danych wyjściowych JSON z CMS do inicjalizacji formularzy. Oto co zrobiłem:
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 ....
Usługa schematu formularza jest tworzona za pomocą kątowego wtryskiwacza zgodnie z oczekiwaniami:
angular.module('myApp.services').
service('FormSchemaService', ['$window' , FormSchemaService ])
A w moich kontrolerach: function () {'use strict';
angular.module('myApp').controller('MyController', MyController);
MyEncapsulatorController.$inject = ['$scope', 'FormSchemaService'];
function MyController($scope, formSchemaService) {
// using the already configured formSchemaService
formSchemaService.buildForm();
Do tej pory jest to programowanie zorientowane na usługi oparte na języku i javascript. Ale integracja starszych wersji jest tutaj:
<script type="text/javascript">
(function(app){
var conf = app.conf = {
'fields': {
'field1: { // field configuration }
}
} ;
app.dispatchEvent(new Event('register-schema'));
})(window);
</script>
Oczywiście każde podejście ma swoje zalety i wady. Zalety i zastosowanie tego podejścia zależy od interfejsu użytkownika. Poprzednio sugerowane podejścia nie działają w moim przypadku, ponieważ mój schemat formularza i starszy kod nie mają kontroli i znajomości zakresów kątowych. Stąd konfigurowanie aplikacji w oparciu o angular.element('element-X').scope();
może potencjalnie uszkodzić aplikację, jeśli zmienimy zakresy. Ale jeśli Twoja aplikacja ma wiedzę na temat zakresu i może polegać na tym, że nie zmienia się często, sugerowane wcześniej podejście jest realne.
Mam nadzieję że to pomoże. Wszelkie opinie są również mile widziane.
var injector = angular.injector(['ng', 'MyApp']);
. Dzięki temu uzyskasz zupełnie nowy kontekst i duplikatmyService
. Oznacza to, że otrzymasz dwa wystąpienia usługi i modelu i dodasz dane w niewłaściwe miejsce. Zamiast tego należy kierować element za pomocą aplikacjiangular.element('#ng-app').injector(['ng', 'MyApp'])
. W tym momencie możesz użyć $ Apply, aby zawinąć zmiany modelu.