Angular.js: دعم الوحدة النمطية غير المتزامنة. run ()

تم إنشاؤها على ١٣ سبتمبر ٢٠١٣  ·  62تعليقات  ·  مصدر: angular/angular.js

نريد إصدار بضع استدعاءات $ http في كتلة تشغيل الوحدة النمطية ، من الناحية المثالية ، يجب أن ينتهي التشغيل فقط بعد $ http وانتهاء المعالجة قبل أن يحدث تجميع dom.

Lots of comments won't fix feature

التعليق الأكثر فائدة

jfcfxekzl5m
ميزة بسيطة ولكن يصعب تنفيذها. 😕

ال 62 كومينتر

هذا ليس بالأمر السهل ولكن يجب النظر فيه.

الطريقة التي يقوم بها Jasmine بذلك هي عن طريق تعيين علامة ، والتي ستسمح للوظيفة بالعمل وانتظار رد النداء حتى يتم تعيين العلم على true ، أو حتى يتم إطلاق المهلة.

شيء من هذا القبيل في الأساس:

var flag = false;
$http(...).success(flag = true);
$timeout(function () {
    flag = true;
    // Or add some error handling stuff here
}, 5000);
while (!flag) {};

إنها ليست جميلة ، لكن يجب أن تقوم بالمهمة. لم يتم اختبار الكود أعلاه ، لذلك قد تحتاج إلى تعديله قليلاً. الوقت يتأخر هنا. نأمل أن تحصل على شيء ما حتى يأتي شيء أجمل قليلاً.

+1

على الرغم من ذلك ، يؤدي هذا في الثانية إلى عدم القدرة على رسم شاشة تحميل رائعة باستخدام التوجيهات الزاوية ...

+1

ألا يحل هذا $routeProvider with resolve هذا؟ ربما لم أفهم المشكلة ...

هذا هو أكثر من أجل دعم الحرف الأول غير المتزامن. مع ذلك ، لم أعد بحاجة إلى هذا في مشاريعي الحالية.

يقومshahata $routeprovider بهذا ، ولكن لا تستخدم كل حالة استخدام للوعد run s المسارات. في حالة الاستخدام الخاصة بي ، إنها للوحدة النمطية التي تغلف توجيهًا ولا علاقة لها بالمسارات.

+1

تحقق مما إذا كانت وظيفة التشغيل تُرجع وعدًا ، ثم قم بالمتابعة فقط عندما يتم حلها. نظرًا لأن runBlocks عبارة عن مجموعة من الوظائف ، فلا يجب أن يكون الأمر صعبًا على الإطلاق

+1

1+ محرج لأنه تم تجاهل هذا

أي فكرة متى هذا سوف يهبط؟ من المحبط للغاية أن تضطر إلى نقل عناصر التهيئة لحلها في جهاز التوجيه ، ويرجع ذلك أساسًا إلى أن رمز التهيئة أحيانًا يكون محايدًا لعنوان url (المعروف أيضًا باسم ، يجب تهيئته لأي نوع من عناوين URL التي يصل المستخدم إلى SPA الخاص بك)

لا أعتقد أن برنامج Angular سيتلقى أي تحسينات من الآن فصاعدًا. يتم إضافتهم جميعًا إلى angular 2.0

ما هي المدة التي ستظل فيها طريقة نصف التقييم run متزامنة؟ من الجيد والمفهوم أن config لا يدعم المكالمات غير المتزامنة ، نظرًا لأنه ليس لديك أي مزودين يقومون بإجراء مكالمات $http ، لكن run يفعلون ذلك. ابحث عن نوع الاختراقات التي يسببها نقص هذه الميزة (التي كان يجب أن تكون موجودة منذ البداية)
https://github.com/philippd/angular-defirmed-bootstrap/blob/master/src/defirmed-bootstrap.js

إنه محرج

+1

يبحث btford في كيفية دعم حالات الاستخدام حول هذا عبر جهاز التوجيه الجديد بدلاً من كتل التشغيل الداخلية.

+1

+1

+1

+1

المشكلة الرئيسية التي نواجهها هي أن $q يتم إنشاؤه داخل وحدة يتم تحميلها عند تشغيل runBlocks. هذا يعني أننا سنحتاج إلى استخراج "بعض" الخدمات (أو ربما الوحدات النمطية) بطريقة أو بأخرى وإنشاء تلك الخدمات أولاً ثم الحصول على مسار ثانٍ يقوم بتحميل بقية الوحدات (والخدمات ، وكتل التشغيل ، وما إلى ذلك) بعد أن يكون لدى $ q تم إنشاؤه.

lgalfaso - ربما يمكنك النظر في هذا قليلاً كجزء من عملك $injector لاحقًا هذا الأسبوع (أو التالي)؟

أعلم أنه مجرد حل بديل ، لكنني عادةً ما قمت بحل مشكلة وجود بعض منطق التمهيد غير المتزامن باستخدام موجه ui الزاوي والحصول على حالة جذر مجردة مع الحل. يجب دائمًا حل حالة الجذر المجردة أولاً ، لذا فهي مكان جيد لتحميل الإعدادات ، وعرض الرسوم المتحركة للتحميل ، وما إلى ذلك.

هذا سيكون حقا رائعا.
: +1:
في انتظار هذا الإصلاح. آمل أن تحصل على 1.4

+1

حصلت على حالة استخدام أخرى: أحتاج إلى بدء نقاط النهاية المحاكية الخاصة بي باستدعاء $ http عند بدء التشغيل (لتخزين بعض البيانات مؤقتًا) ...

+1

+1

فقط تعثرت في هذا أيضًا ...

petebacondarwin أعتقد أنه سيكون من الجيد الاستمرار في تحميل جميع الوحدات الأخرى ، ولكن تأجيل بدء التنقل الأولي.

بدلاً من ذلك ، يمكن أن يقدم $ routeProvider معلمة دالة قابلة للتكوين والتي يجب أن تؤجل عرض المسار الأولي.

+1

+1

إليك حل بديل: http://plnkr.co/edit/vi7mDjmD4NpZAoP7MVzr؟p=preview
الفكرة هي أن Angular يمنحك في الواقع القدرة على إنشاء حاقن خاص بك من مجموعة من الوحدات. في هذه الحالة ، قمت بتأخير تجميع $rootElement حتى يتم حل مجموعة من الوعود ( resolves ). هذا هو POC وسيكون هناك عدد من الأجراس والصفارات الأخرى التي ستكون ضرورية لجعل هذا الإنتاج جاهزًا. بصرف النظر عن أي شيء آخر ، قد تحتاج إلى اكتشاف الأخطاء في الحلول بدلاً من مجرد ابتلاعها.

+1

هذا في الغالب دليل لمن يريد أن يجربها ؛ تقوم عملية التمهيد حاليًا بما يلي:

  • فحوصات السلامة
  • ينتج المنتج مقابل $rootElement
  • يصنع الحاقن
  • تجميع وصلات $rootElement

في الأعلى ، عند إنشاء الحاقن ، الخطوات هي التالية:

  • عبور شجرة وحدة التبعية و

    • تهيئة الوحدة النمطية التي من شأنها تسجيل ثوابت الوحدة والقيم والمزودين وأشياء أخرى

    • تشغيل وظائف التكوين

    • جمع وظائف run لوقت لاحق

  • قم بتشغيل جميع وظائف run

هناك بعض النقاط الرئيسية:

  • يتم تنفيذ جميع الكتل run قبل تجميع $rootElement
  • لا توجد دورات ملخص في عملية إنشاء الحاقن ، تكون دورة التلخيص الأولى أثناء التجميع الأولي لـ $rootElement
  • $q يحل الوعود أثناء دورة الملخص _ فقط_

هذا هو:

  • إذا كانت هناك وحدة بها وظيفة run ترجع وعدًا ويحتاج الوعد إلى حل قبل بدء التطبيق ، فستكون هناك دورات ملخّصة قبل التجميع الأولي (قد يؤدي ذلك إلى كسر التطبيقات الحالية)
  • لا يمكن لكتلة التكوين إرجاع وعد حيث يتم حقن وظيفة config مع الموفرين ، وليس مع المثيلات

مهما كان الحل ، يحتاج للتعامل مع هذه الحالات

+1
أى اخبار؟
أريد فقط تحميل بعض إعدادات التكوين قبل أن يبدأ التطبيق بالفعل.

+1

أود تحميل بعض البيانات غير المتزامنة بعد التمهيد عندما تكون جميع المصانع الخاصة بي جاهزة وقبل التجميع.

dagingaa : أعتقد أنني سأختار الحل الخاص بك كحل بديل! شكرا

  • 1

تحديث إلى dagingaa : حلقة for تجميد

https://jsfiddle.net/tuxmachine/t4d63vnw/

هذه هي الطريقة التي قمت بها بحلها من أجل تنفيذ رمز OAuth المميز ، والذي تطلب حل استدعاء ajax الأولي قبل تهيئة بقية التطبيق.

لن تعمل إذا كان لديك العديد من الكتل غير المتزامنة

+1

+1

+1

لقد مضى عامان منذ فتح القضية ولا يوجد حتى الآن حل جيد

vladmiller هناك حلول ولكن ربما لا تشعر أنها جيدة:

  • استخدم ngRoute أو ui-router مع الحلول ووضع كود بدء تشغيل التطبيق الخاص بك داخل مسار المستوى الأعلى
  • قم بإنشاء التمهيد غير المتزامن الخاص بك. انظر https://github.com/angular/angular.js/issues/4003#issuecomment -113842180
  • استخدم جهاز توجيه المكون الجديد مع $onActivate في مكون المستوى الأعلى

يؤدي وضع عمل تطبيق غير تافه داخل كتل .run إلى صعوبة اختبار الوحدة للكود. لذا فهو ليس شيئًا نريد تشجيعه. نقل هذا إلى Ice Box كشيء من غير المحتمل أن ننفذها.

petebacondarwin أنا أختلف معك ؛ يتوقع الجميع أن يكون Angluar بسيطًا وبديهيًا ، وبدلاً من ذلك يتعين عليك إما تنفيذ وحدة التمهيد غير المتزامن الخاصة بك أو وحدة التمهيد في مكان مختلف. في رأيي ، هذا يجعل الزاوي أكثر تعقيدًا.

هل يمكنك أيضًا شرح ما تقصده عندما تقول أن الكود غير المتزامن في .run سيجعل الاختبار أكثر صعوبة؟

أعتذر عن تعليقي الوقح السابق.
شكرا

petebacondarwin أنا لا أرى كيف أنه يجعل من الصعب الاختبار. إذا قمت بوضع كود التهيئة في خدمة ما ، يمكنك فقط مشاهدة / محاكاة / مقارنة النتائج التي تتوقعها من محاكاة http الخلفية ، بغض النظر عما إذا كان يتم تنفيذها داخل كتلة .run أم لا. وجود رمز خارج الزاوية بسبب الحلول البديلة لعدم وجود تشغيل غير متزامن هو ما يجعل اختباره شبه مستحيل

كيف الحال؟

حل petebacondarwin يعمل بالنسبة لي

نظرًا لوجود حلول بديلة ودعم كتل التشغيل غير المتزامن ستضيف تعقيدًا إلى التمهيد ، لا أعتقد أننا سنقوم بتنفيذ هذه الميزة.

jfcfxekzl5m
ميزة بسيطة ولكن يصعب تنفيذها. 😕

+1 لهذه الميزة

+1

+1

حل petebacondarwin يعمل بشكل جيد.

+1. :(

+1

+1

+1

+1

لن نقوم بهذا.

+100 ، كل العمل حولك سيء.

@ Eduardo-Julio - لن ننفذ هذه الميزة لأنها ستجعل التمهيد لتطبيقات AngularJS أكثر تعقيدًا. لن تساعد إضافة المزيد من + s.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات