1. حقن التبعية
حقن التبعية (DI) هو نمط لتصميم البرمجيات يتناول كيفية الحصول على الكود الموارد التي يعتمد عليها.
لمناقشة أعمق حول DI ، يمكنك زيارة حقن التبعية (http://en.wikipedia.org/wiki/Dependency_injection) ، أو انعكاس التحكم (http://martinfowler.com/articles/injection.html) ، أو يمكنك زيارة أنماط تصميم البرنامج.
1. دي باختصار (ببساطة يتحدث دي)
يمكن للكائن أو الوظيفة الحصول على الموارد التي يعتمدون عليها فقط بالطرق الثلاث التالية:
1) يمكنك إنشاء موارد تابعة من خلال المشغل الجديد.
2) يمكنك العثور على موارد تابعة من خلال المتغيرات العالمية.
3) يمكن تمرير الموارد التابعة من خلال المعلمات.
لا هما الطريقتان 1 و 2 هي الأفضل ، لأنها ترمز إلى التبعيات الصعبة ، مما يجعل من المستحيل تعديل التبعيات ، لكنها ستصبح أكثر تعقيدًا. هذه مشكلة خاصة للاختبار ، وعادة ما تكون عند الاختبار بشكل مستقل ، من المطلوب توفير تبعيات وهمية.
الطريقة الثالثة هي الأكثر جدوى نسبيا لأنها تزيل مسؤولية تحديد موقع التبعيات من المكونات. يتم تسليم الاعتماد فقط إلى المكونات.
وظيفة someclass (Greeter) {this.greeter = Greeter} someclass.prototype.dosomething = function (name) {this.greeter.greet (name) ؛}في المثال أعلاه ، لا يحتاج SomeClass إلى الاهتمام بتحديد موقع التبعية للترحيب ، فهو يمر فقط في وقت التشغيل.
هذا أكثر ملاءمة ، لكنه يترك مسؤولية الحصول على موارد التبعية للرمز المسؤول عن بناء سومكلاس.
لإدارة مسؤولية إنشاء التبعيات ، يكون لكل تطبيق زاوي حاقن (http://code.angularjs.org/1.0.2/docs/api/angular.injector). الحاقن هو محدد موقع خدمة مسؤول عن تحديد موقع وإنشاء موارد تابعة.
طلب التبعيات ، ويحل مشكلة الكود الصلب ، ولكن هذا يعني أن الحاقن يحتاج إلى تشغيل التطبيق بأكمله. سوف يدمر الحاقن الممر قانون ديميتر (http://baike.baidu.com/view/823220.htm). لتصحيح هذه المشكلة ، نقوم بنقل مسؤولية عمليات البحث عن التبعية إلى الحاقن.
لقد قلت الكثير أعلاه. انظر إلى الأمثلة التي قمت بتعديلها أدناه. لقد قمت بدمج مثالين على النص الأصلي ، باستخدام الحقن داخل وخارج الزاوي:
<! doctype html> <html lang = "zh-cn" ng-app = "mainapp"> <head> <meta charset = "utf-8"> <title> enjector </title> </head> <body> <div ng-controller = "myController"> <tratute click = " src = "../ Angular-1.1.1.js" type = "text/javaScript"> </script> <script type = "text/javaScript"> // إنشاء الوحدة الأخرى ، والتي تعادل الوحدة الخارجية var othermodule = Angular.Module ("othermodule ، []) ؛ // تعليم الحاقن كيفية إنشاء "تحية" // لاحظ أن Greeter نفسه يحتاج إلى الاعتماد على $ Window OtherModule.Factory ("Greeter" ، Function ($ window) {// هذه طريقة مصنع ، مسؤولة عن إنشاء خدمة تحية {Greet: function (text) {$ window.alert (text) ؛}}} ؛}) ؛ // يوضح ما يلي أنه في الوحدة النمطية غير المشتركة ، اتصل بالطريقة المعيارية من خلال الحاقن: // إنشاء حاقن جديد من الوحدة النمطية // عادةً ما تتم هذه الخطوة تلقائيًا عند بدء تشغيل الزاوي. // "ng" ، يجب تقديم الأشياء الزاوية // يتم عكس الأمر عمداً ، ويتم تأكيد ذلك مؤقتًا أن ترتيب هذا الشيء لا يهم. . var enjector = Angular.Injector (['OtherModule' ، 'ng']) ؛ // طلب تبعية Greeter. var g = enjector.get ("Greeter") ؛ // نسميها مباشرة ~ g.greet ("مرحبًا ~ بلدي dada ~") ؛ // هذا هو التطبيق الرئيسي الحالي ، وتحتاج إلى الاعتماد على othermodule var mainapp = Angular.module ("mainapp" ، ["othermodule"]) ؛ // انتبه إلى معلمات وظيفة تعريف وحدة التحكم ، وحقن نطاق $ والترحيب مباشرة هنا. // خدمة Greeter هي mainapp.controller ("myController" ، وظيفة myController ($ scope ، Greeter) {$ scope.sayhello = function () {Greeter.greet ("hello kitty ~~") ؛} ؛}) ؛ // ng-controller فعل هذا الشيء بصمت وراء الكواليس //injector.instantiate(myController) ؛ </script> </body> </html>لاحظ أنه نظرًا لوجود التحكم في NG ، يتم تهيئة MyController ، يمكن أن تلبي جميع تبعيات MyController ، بحيث لا يحتاج MyController إلى معرفة وجود الحاقن. هذه هي أفضل نتيجة. يطلب رمز التطبيق ببساطة التبعيات التي يحتاجها دون التعامل مع الحاقن. هذا الإعداد لن يكسر قانون ديميتر.
2. شرح التبعية (تعليقات التبعية ، شرح طريقة التبعيات)
كيف يعرف الحاقن ما هي الخدمة التي يجب حقنها؟
يحتاج مطورو التطبيقات إلى توفير معلومات التعليقات التوضيحية التي يستخدمها الحاقن كحل لتبعيات. تشير جميع وظائف API الموجودة في الزاوي إلى الحاقن ، وهذا هو الحال مع واجهة برمجة التطبيقات المذكورة في كل مستند. فيما يلي ثلاث طرق مكافئة للتعليق على رمزنا بمعلومات اسم الخدمة.
1. استنتاج التبعيات
هذه هي أسهل طريقة للحصول على مورد تابع ، ولكن من الضروري افتراض أن اسم المعلمة للوظيفة يتوافق مع اسم المورد التابع.
وظيفة myController (نطاق $ ، تحية) {...}يمكن أن يخمن حاقن الدالة اسم الخدمة التي يجب حقنها (functionName.toString () ، regexp) عن طريق التحقق من تعريف الوظيفة واستخراج اسم الوظيفة. في المثال أعلاه ، يكون النطاق والترحيب $ هي خدمتان تحتاج إلى حقن في الوظيفة (الأسماء هي نفسها أيضًا).
على الرغم من أن هذا أمر بسيط ، فإن هذه الطريقة لن تعمل بعد ضغط javaScript forcing ، لأنه سيتم تغيير اسم المعلمة. هذا يجعل هذه الطريقة مفيدة فقط للتخلي عن النموذج (طريقة اختبار النموذج الأولي للمنتج ، http://www.pretotyping.org/ ، http://tech.qq.com/a/20120217/000320.htm) والتطبيقات التجريبية.
2. التعليق التوضيحي للحقن (تعليق حقن $)
من أجل السماح لضاغط البرنامج النصي بإعادة تسمية طريقة الوظيفة ويظل قادرًا على ضخ الخدمة الصحيحة ، يجب أن تعلق الوظيفة على التبعية من خلال خاصية الحقن $. خاصية حقن $ هي مجموعة من أسماء الخدمات التي يجب حقنها.
var myController = function (تم إعادة تسمية $ scope ، reamedgreeter) {...} // إذا كان الشيء الذي يعتمد هنا ليس في الوحدة النمطية الحالية ، فهو لا يزال لا يتعرف عليه. //تحتاج إلى الاعتماد أولاً على الوحدة النمطية المقابلة في الوحدة الحالية. إنه يشبه المثال السابق. لكني لا أعرف ما إذا كان هذا هو الطريق الصحيح.
myController. $ enject = ['$ scope' ، 'Greeter'] ؛
يجب أن يكون حريصًا على أن يكون ترتيب الحقن $ متسقًا مع ترتيب الحجج المعلنة في الوظيفة.
تعتبر طريقة التعليقات التوضيحية هذه مفيدة لإعلانات وحدة التحكم لأنها تحدد معلومات التعليقات التوضيحية مع الوظيفة.
3. التعليق التوضيحي المضمّن (تعليقات مضمنة)
في بعض الأحيان ، لا يكون من المناسب استخدام طريقة التعليقات التوضيحية للحقوق $ ، مثل عند التعليق مباشرة.
على سبيل المثال:
somemodule.factory ('Greeter' ، function ($ window) {... ؛}) ؛نظرًا لأن المتغيرات المؤقتة مطلوبة (منعها من عدم القدرة على استخدامها بعد الضغط) ، فإن الكود سوف ينفخ على النحو التالي:
var mereerFactory = function (تم إعادة تسمية $ window) {... ؛} ؛ MEREERFACTORY. $ enject = ['$ window']ولهذا السبب (رمز الانتفاخ) ، يوفر Angular أيضًا نمط تعليق ثالث:
somemodule.factory ('Greeter' ، ['$ window' ، function (أعيد تسمية $ window) {... ؛}]) ؛تذكر أن جميع أنماط التعليقات مكافئة ويمكن استخدامها في أي مكان في زاوية تدعم الحقن.
3. أين يمكنني استخدام DI؟
دي في جميع أنحاء الزاوي. وعادة ما يستخدم في طرق وحدة التحكم والمصنع.
1. دي في وحدات التحكم
وحدة التحكم هي الفئة المسؤولة عن (وصف) سلوك التطبيق. طريقة إعلان وحدة التحكم الموصى بها هي:
var myController = function (dep1 ، dep2) {...} myController. $ enject = ['dep1' ، 'dep2'] ؛2. أساليب المصنع
طريقة المصنع مسؤولة عن إنشاء معظم الكائنات الزاوية. على سبيل المثال ، التوجيه ، الخدمة ، مرشح. يتم تسجيل طريقة المصنع في الوحدة النمطية. طريقة إعلان المصنع الموصى بها هي:
jualar.module ('mymodule' ، []). config (['depprovider' ، function (depprovider) {...}]). Factory ('ServiceId' ، ['depservice' ، function (depservice) {...}]). التوجيه ('DIREVIVERAME' ، ['DEPSERVICE' ، وظيفة (DEPSERVICE) {...}]). Filter ('filtername' ، ['depservice' ، function (depservice) {...}]) ؛ما سبق هو ملخص معلومات حقن التبعية AngularJS. شكرا لك على دعمك لهذا الموقع!