Ich weiß, dass dies eine alte Frage ist, aber ich habe mir Optionen angesehen, um das vor kurzem zu tun, also dachte ich, ich würde meine Ergebnisse hier veröffentlichen, falls es für irgendjemanden nützlich ist.
In den meisten Fällen, wenn externe Code-Legacy benötigt wird, um mit dem Zustand der Benutzeroberfläche oder den internen Funktionen der Anwendung zu interagieren, könnte ein Dienst nützlich sein, um diese Änderungen wegzuspulen. Wenn ein externer Code direkt mit Ihrem eckigen Controller, Ihrer Komponente oder Ihrer Direktive interagiert, koppeln Sie Ihre App stark mit Ihrem alten Code, was eine schlechte Nachricht ist.
Was ich in meinem Fall verwendet habe, ist eine Kombination von Browser-zugänglichen globalen (d. H. Fenster) und Ereignisbehandlung. Mein Code verfügt über eine intelligente Formulargenerierungs-Engine, die JSON-Ausgabe von einem CMS erfordert, um die Formulare zu initialisieren. Hier ist, was ich getan habe:
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 ....
Formular Schema Dienst wird unter Verwendung von Winkel Injektor geschaffen wie erwartet:
angular.module('myApp.services').
service('FormSchemaService', ['$window' , FormSchemaService ])
Und in meinem Controller: function() { 'use strict';
angular.module('myApp').controller('MyController', MyController);
MyEncapsulatorController.$inject = ['$scope', 'FormSchemaService'];
function MyController($scope, formSchemaService) {
// using the already configured formSchemaService
formSchemaService.buildForm();
Bis jetzt ist dies reine eckige und JavaScript Service orientierte Programmierung. Aber die Legacy-Integration kommt hier:
<script type="text/javascript">
(function(app){
var conf = app.conf = {
'fields': {
'field1: { // field configuration }
}
} ;
app.dispatchEvent(new Event('register-schema'));
})(window);
</script>
Offensichtlich hat jeder Ansatz seine Vor- und Nachteile. Die Vorteile und der Nutzen dieses Ansatzes hängen von Ihrer Benutzeroberfläche ab. Die zuvor vorgeschlagenen Ansätze funktionieren in meinem Fall nicht, da mein Formularschema und mein Legacy-Code keine Kontrolle und Kenntnisse über Winkelbereiche besitzen. Daher könnte das Konfigurieren meiner App basierend auf angular.element('element-X').scope();
die App potenziell beschädigen, wenn wir die Bereiche ändern. Aber wenn Sie wissen, dass das App das Scoping kennt und darauf vertrauen kann, dass es sich nicht oft ändert, ist ein praktikabler Ansatz vorgeschlagen.
Hoffe, das hilft. Jede Rückmeldung ist ebenfalls willkommen.
Beachten Sie, dass in der Jfiddle über dem Injektor erhalten wird, ohne ein Element innerhalb der App mit 'var injector = angular.injector (['ng', 'MyApp']); Dadurch erhalten Sie einen völlig neuen Kontext und einen doppelten 'myService'. Das bedeutet, dass Sie zwei Instanzen des Dienstes und des Modells erhalten und Daten an der falschen Stelle hinzufügen. Sie sollten stattdessen ein Element innerhalb der App mit 'angular.element ('# ng-app') ansteuern. Injector (['ng', 'MyApp'])'. An dieser Stelle können Sie $ apply verwenden, um Modelländerungen zu umbrechen. –