Angular.js: إرجاع angular.element.scope () غير معرف

تم إنشاؤها على ٩ أكتوبر ٢٠١٤  ·  29تعليقات  ·  مصدر: angular/angular.js

angular.element.scope () غير معرف عندما يتم تحميل التطبيق في iframe عن طريق تغيير سمة iframe src.

يجب أن يُرجع الكود التالي مرجعًا إلى النطاق ولكنه يُرجع غير محدد:

angular.element(document.body).scope()

يتم تنفيذ الكود أعلاه في معالج onclick بعد تحميل المستند وانتهاء الزاوية من التمهيد:

<script>
    document.addEventListener("click", function(){
        console.log(angular.element(document.body).scope());
    });
</script>

تظهر المشكلة نفسها فقط عند تحميل المستند في iframe من خلال تعديل السمة src الخاصة به.
تم الاختبار مع 1.3.0-rc.5 ، بدون استفسار.

jqLite more info

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

إذا كنت ترغب في تمكين معلومات التصحيح مؤقتًا (على سبيل المثال لتصحيح مشكلة في تطبيق إنتاج مباشر) ، يمكنك استخدام angular.reloadWithDebugInfo() كما هو موضح هنا .

ال 29 كومينتر

هل يمكنك تقديم نسخة plnkr من المشكلة من فضلك؟

لدي نفس المشكلة في مشروعي الخاص ، لكن لا يمكنني إعادة إنتاجها باستخدام plnkr.

النطاق () يعيد غير معرف على أي عنصر.

يؤدي استخدام JQLite أو JQuery 2.1.1 إلى نفس الشيء.

AngularJS 1.3.1.

جرب هذا:

document.addEventListener('DOMContentLoaded', function () {
  angular.element(document.body).scope();
});

هل تقوم بتعطيل معلومات التصحيح في مشروعكVictorQueiroz؟

caitp لقد وجدتها.

يُعد تمكين إعادة معلومات التصحيح حلاً جيدًا لهذه المشكلة.

حل جيد

:ابتسامة ابتسامة ابتسامة:

آسف يا شباب لعدم الرد لفترة من الوقت. ترتبط المشكلة بطريقة ما بـ jqCache ، أو بشكل أكثر تحديدًا بطريقة إنشاء expandoId. في RC الأقدم ، تم إنشاء المعرف على النحو التالي:
var expandoId = element[JQLite.expando];
في الإصدارات الأحدث ، يتم الحصول على المعرّف باستخدام الخاصية hardcoded:
var expandoId = element.ng339;
أدى التراجع عن التغيير إلى حل المشكلة.
لسوء الحظ ، لا أعرف الكثير عن الأشياء ، لذلك إذا تمكن شخص ما من تسليط الضوء على الوظيفة ، فربما سأكون قادرًا على وصف المشكلة بمزيد من التفصيل.

يا نجاح باهر شكرا caitp الذي كان يقودني إلى الجنون!
يجب أن تكون هناك ملاحظة في المستند على $ compileProvider توضح أن $compileProvider.debugInfoEnabled(false) سيجعل الدالة scope() تُرجع غير محددة ، إذا كان هذا هو السلوك المتوقع.

تحرير: سيئتي ، إنه موجود بالفعل في المستند

قم باستدعاء هذه الطريقة لتمكين / تعطيل معلومات وقت تشغيل تصحيح الأخطاء المختلفة في المترجم مثل إضافة معلومات ربط وإشارة إلى النطاق الحالي على عناصر DOM.

هل هناك طريقة للتغلب على ذلك؛ وجود debugInfoEnabled (خطأ) ، ولكن لا تزال قادرًا على الوصول إلى نطاق عنصر؟

إذا كنت ترغب في تمكين معلومات التصحيح مؤقتًا (على سبيل المثال لتصحيح مشكلة في تطبيق إنتاج مباشر) ، يمكنك استخدام angular.reloadWithDebugInfo() كما هو موضح هنا .

أعتقد أن gkalpak أوضح الأشياء هنا!

لماذا اغلاق؟ لا يعني العثور على حل بديل أن المشكلة قد تم إصلاحها ، يجب أن يعيد النطاق () النطاق المرفق بغض النظر عن وضع التصحيح.

إذا لم يكن ذلك ممكنًا ، فيجب أن يكون موثقًا بشكل واضح في angular.element #scope () doc.

Toilal لقد أغلقته لأنه موثق بالفعل كما هو مذكور في التعليقات السابقة لهذا الموضوع. ولكن إذا كنت تعتقد أنه يجب توثيقها في أماكن أخرى ، فستكون العلاقات العامة موضع تقدير كبير!

لا يمكنني ذلك لأنني لست متأكدًا من أن أساليب الساحرة من عنصر الزاوية لن تعمل عند تعطيل التصحيح. النطاق () بالتأكيد لأنني جربته ، ولكن ماذا عن الآخرين ، مثل جهاز التحكم () ، الحاقن () ...

بعد الاختبار ، فإنه يؤثر فقط على النطاق () وعزل النطاق (). سوف أقوم بتوثيق هؤلاء وإجراء العلاقات العامة.

ولكن هل هناك أي طريقة لاسترداد النطاق من عنصر DOM أثناء تعطيل معلومات التصحيح؟

Toilal - ليس حقًا - تمت إزالة معلومات النطاق لأن الكشف عنها له تأثير مثالي - ولهذا السبب تم إخفاؤها خلف علامة التصحيح.

لكن لن يكون من الصعب كتابة توجيه يمكنه فعل ذلك ووضعه على العناصر التي تحتاج إلى التحقق منها

بفضل @ pkozlowski- مفتوح المصدر. لقد أضفت جملة صغيرة حول النطاق () و العزلة () في المستندات ، لأن الأمر يتطلب مني بعض الأوقات لمعرفة سبب عدم نجاح هذه الأساليب في تطبيقي.

ocombe هذا ما

setTimeout (الوظيفة () {
console.log (angular.element (document.body) .scope ()) ؛
} ، 100) ؛

qq 20160115164505

تضمين التغريدة

هل هناك طريقة للتغلب على ذلك؛ وجود debugInfoEnabled (خطأ) ، ولكن لا تزال قادرًا على الوصول إلى نطاق عنصر؟

لقد استخدمت الطريقة التالية snipet _ (غير مستحسن) _ في الوظيفة link لتعريف التوجيه.

link: function(scope, element, attrs) {
  var isolatedScope = scope.$$childTail;
}

هل هناك أي طريقة للتحقق مما إذا كان debugInfo معطلاً أو أي علامة عليه؟

من داخل التطبيق ، يمكنك استخدام $compileProvider.debugInfoEnabled() .
إذا كنت تريد تصحيح أخطاء مثيل مباشر تم تعطيل معلومات تصحيح الأخطاء فيه (مثل نشر الإنتاج) ، فيمكنك الاتصال بـ angular.reloadWithDebugInfo() من وحدة التحكم وسيتم إعادة تحميل التطبيق مع تمكين معلومات التصحيح.

gkalpak أريد فقط التحقق مما إذا تم تمكين معلومات التصحيح أم لا. إلى حد ما مثل هذا.

if(angular.isDebugInfoEnabled()) {
  // Do something
}

hemkaran ، لا يزال من غير الواضح _ في أي مكان تريد التحقق منه. أفترض من داخل تطبيقك.
إذا كان هذا هو الحال بالفعل ، فيمكنك استخدام $compileProvider.debugInfoEnabled() .

Toilal هل كتبت توجيهًا
ccocombe

عذرًا ، لم أعد أستخدم Angular 1 بعد الآن ، ولم أضطر أبدًا إلى كتابة مثل هذا التوجيه (لأنني كنت بحاجة إلى هذه المعلومات فقط في وضع التطوير)

فعلت ما يلي. سنرى ما إذا كان زملائي في الفريق سيسمحون بذلك من خلال المراجعة :)

function exposeScope() {
    return {
        restrict: 'A',
        link: function(scope, element) {
            element[0].APPNAME = {
                getScope: function() {
                    return scope;
                }
            };
        }
    };
}

return {
        restrict: 'A',
        scope: false,
        link: function(scope, elem) {
            elem.data('$scope', scope);
        }
    };

يمكنك أيضًا تعيين العزلة المتوافقة مع $ IsolateScope على نفسها إذا كنت في حاجة إليها.

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