Bunun eski bir soru olduğunu biliyorum, ancak son zamanlarda bunu yapmak için seçeneklere bakıyordum, bu yüzden bulgularımı herkes için yararlı olması durumunda buraya koyduğumu düşündüm.
Çoğu durumda, UI'nin durumu veya uygulamanın iç işleyişleri ile etkileşim için harici eski kodlara ihtiyaç duyuluyorsa, bir hizmet bu değişiklikleri soyutlamak için yararlı olabilir. Harici bir kod açısal denetleyiciniz, bileşeniniz veya direktifinizle doğrudan etkileşime giriyorsa, uygulamanızı büyük ölçüde kötü haber olan eski kodunuzla eşleştiriyorsunuzdur.
Benim durumumda kullandığım şey, tarayıcı erişilebilir küresellerin (yani pencere) ve olay işlemenin bir kombinasyonudur. Kodum, formları başlatmak için bir CMS'den JSON çıktısı gerektiren akıllı bir form oluşturma motoruna sahiptir. İşte yaptığım:
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 ....
Form Şeması Hizmeti, beklendiği gibi açısal enjektör kullanılarak oluşturulur:
angular.module('myApp.services').
service('FormSchemaService', ['$window' , FormSchemaService ])
Ve denetleyicilerimde: function () {'use strict';
angular.module('myApp').controller('MyController', MyController);
MyEncapsulatorController.$inject = ['$scope', 'FormSchemaService'];
function MyController($scope, formSchemaService) {
// using the already configured formSchemaService
formSchemaService.buildForm();
Şimdiye kadar bu saf açısal ve javascript servis odaklı programlama. Ancak eski entegrasyon buraya gelir:
<script type="text/javascript">
(function(app){
var conf = app.conf = {
'fields': {
'field1: { // field configuration }
}
} ;
app.dispatchEvent(new Event('register-schema'));
})(window);
</script>
Açıkçası her yaklaşımın avantajları ve dezavantajları vardır. Bu yaklaşımın avantajları ve kullanımı kullanıcı arayüzünüze bağlıdır. Önceden önerilen yaklaşımlar benim durumumda işe yaramıyor çünkü form şemamın ve eski kodumun açısal kapsamların kontrolü ve bilgisi yok. Uygulamamı temel alarak yapılandırmak angular.element('element-X').scope();
, kapsamları değiştirirsek uygulamayı bozabilir. Ancak uygulamanızın kapsam belirleme bilgisine sahip olması ve sık sık değişmemesine güvenebiliyorsanız, daha önce önerilen şey uygulanabilir bir yaklaşımdır.
Bu yardımcı olur umarım. Herhangi bir geri bildirim de açığız.
var injector = angular.injector(['ng', 'MyApp']);
. Bunu yapmak size tamamen yeni bir bağlam ve bir kopya verecektirmyService
. Bu, hizmet ve modelin iki örneğiyle sonuçlanacağınız ve yanlış yere veri ekleyeceğiniz anlamına gelir. Bunun yerine, uygulama içindeki bir öğeyi hedeflemelisinizangular.element('#ng-app').injector(['ng', 'MyApp'])
. Bu noktada, model değişikliklerini sarmak için $ Apply kullanabilirsiniz.