ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันดูตัวเลือกในการทำเช่นนี้เมื่อเร็ว ๆ นี้ดังนั้นฉันคิดว่าฉันใส่สิ่งที่ฉันค้นพบที่นี่ในกรณีที่เป็นประโยชน์กับทุกคน
ในกรณีส่วนใหญ่หากจำเป็นต้องใช้รหัสดั้งเดิมภายนอกเพื่อโต้ตอบกับสถานะของ UI หรือการทำงานภายในของแอปพลิเคชันบริการอาจมีประโยชน์ในการแยกการเปลี่ยนแปลงเหล่านั้นออก หากรหัสภายนอกมีการโต้ตอบโดยตรงกับตัวควบคุมเชิงมุมส่วนประกอบหรือคำสั่งของคุณคุณกำลังเชื่อมโยงแอปของคุณอย่างหนักกับรหัสดั้งเดิมซึ่งเป็นข่าวร้าย
สิ่งที่ฉันใช้ในกรณีของฉันคือการรวมกันของ globals สามารถเข้าถึงเบราว์เซอร์ (เช่นหน้าต่าง) และการจัดการเหตุการณ์ รหัสของฉันมีเอ็นจิ้นการสร้างแบบฟอร์มอัจฉริยะซึ่งต้องการเอาต์พุต 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 ....
บริการ Schema แบบฟอร์มถูกสร้างขึ้นโดยใช้หัวฉีดเชิงมุมตามที่คาดไว้:
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();
จนถึงตอนนี้นี่คือการเขียนโปรแกรมเชิงบริการเชิงบริสุทธิ์และเชิงจาวาสคริปต์ แต่การรวมมรดกมาที่นี่:
<script type="text/javascript">
(function(app){
var conf = app.conf = {
'fields': {
'field1: { // field configuration }
}
} ;
app.dispatchEvent(new Event('register-schema'));
})(window);
</script>
เห็นได้ชัดว่าทุกวิธีมีข้อดีและข้อเสีย ข้อดีและการใช้วิธีนี้ขึ้นอยู่กับ UI ของคุณ แนวทางที่แนะนำก่อนหน้านี้ไม่ทำงานในกรณีของฉันเนื่องจากสคีมาของฉันและรหัสดั้งเดิมไม่มีการควบคุมและความรู้เกี่ยวกับขอบเขตเชิงมุม ดังนั้นการกำหนดค่าแอพของฉันตามangular.element('element-X').scope();
อาจทำให้แอพแตกถ้าเราเปลี่ยนขอบเขต แต่ถ้าแอพของคุณมีความรู้เกี่ยวกับการกำหนดขอบเขตและสามารถพึ่งพามันได้ไม่เปลี่ยนแปลงบ่อยครั้งสิ่งที่แนะนำก่อนหน้านี้คือวิธีการปฏิบัติ
หวังว่านี่จะช่วยได้ ข้อเสนอแนะใด ๆ ก็ยินดีต้อนรับ
var injector = angular.injector(['ng', 'MyApp']);
ที่ใช้myService
การทำเช่นนี้จะทำให้คุณมีบริบทใหม่ที่สมบูรณ์และที่ซ้ำกัน นั่นหมายความว่าคุณจะได้รับบริการและรุ่นของอินสแตนซ์ที่สองและจะเพิ่มข้อมูลไปยังตำแหน่งที่ไม่ถูกต้อง คุณควรกำหนดเป้าหมายองค์ประกอบภายในแอปที่ใช้angular.element('#ng-app').injector(['ng', 'MyApp'])
แทน ณ จุดนี้คุณสามารถใช้ $ ใช้เพื่อตัดการเปลี่ยนแปลงโมเดล