Saya tahu ini adalah pertanyaan lama tetapi saya sedang mencari opsi untuk melakukan ini baru-baru ini, jadi saya pikir saya menaruh temuan saya di sini kalau-kalau itu berguna bagi siapa pun.
Dalam kebanyakan kasus, jika ada kebutuhan untuk kode warisan eksternal untuk berinteraksi dengan keadaan UI atau cara kerja aplikasi, layanan dapat berguna untuk menghilangkan perubahan-perubahan tersebut. Jika kode eksternal berinteraksi langsung dengan pengontrol sudut, komponen, atau arahan Anda, Anda sangat menyambungkan aplikasi Anda dengan kode lawas yang merupakan berita buruk.
Apa yang akhirnya saya gunakan dalam kasus saya, adalah kombinasi global yang dapat diakses browser (yaitu jendela) dan penanganan acara. Kode saya memiliki mesin pembuat formulir cerdas yang membutuhkan output JSON dari CMS untuk memulai formulir. Inilah yang telah saya lakukan:
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 ....
Formulir Layanan Skema dibuat menggunakan injektor sudut seperti yang diharapkan:
angular.module('myApp.services').
service('FormSchemaService', ['$window' , FormSchemaService ])
Dan di controller saya: function () {'use strict';
angular.module('myApp').controller('MyController', MyController);
MyEncapsulatorController.$inject = ['$scope', 'FormSchemaService'];
function MyController($scope, formSchemaService) {
// using the already configured formSchemaService
formSchemaService.buildForm();
Sejauh ini ini adalah pemrograman berorientasi layanan murni javascript dan javascript. Tetapi integrasi warisan datang ke sini:
<script type="text/javascript">
(function(app){
var conf = app.conf = {
'fields': {
'field1: { // field configuration }
}
} ;
app.dispatchEvent(new Event('register-schema'));
})(window);
</script>
Jelas setiap pendekatan memiliki kelebihan dan kekurangannya. Keuntungan dan penggunaan pendekatan ini tergantung pada UI Anda. Pendekatan yang disarankan sebelumnya tidak berfungsi dalam kasus saya karena skema bentuk dan kode lama saya tidak memiliki kontrol dan pengetahuan tentang cakupan sudut. Oleh karena itu mengonfigurasi aplikasi saya berdasarkan angular.element('element-X').scope();
berpotensi dapat merusak aplikasi jika kita mengubah cakupannya. Tetapi jika aplikasi Anda memiliki pengetahuan tentang pelingkupan dan dapat mengandalkannya agar tidak sering berubah, apa yang disarankan sebelumnya adalah pendekatan yang layak.
Semoga ini membantu. Umpan balik juga diterima.
var injector = angular.injector(['ng', 'MyApp']);
. Melakukan ini akan memberi Anda konteks yang sama sekali baru dan duplikatmyService
. Itu berarti Anda akan berakhir dengan dua contoh layanan dan model dan akan menambahkan data ke tempat yang salah. Anda sebaiknya menargetkan elemen di dalam aplikasi menggunakanangular.element('#ng-app').injector(['ng', 'MyApp'])
. Pada titik ini Anda dapat menggunakan $ apply untuk membungkus perubahan model.