سؤال

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

مثال:

<input ng-model="mode"></input>
<span ng-bind-html="mode"></span>

تحديث بعضها البعض بشكل جيد ولكن

angular.element("body").scope().$root.mode = 'test'

يقوم بتحديث وحدة التحكم ولكن ليس له أي تأثير على الارتباطات.لقد قمت بمقارنة وحدة التحكم الأصلية ووحدة التحكم الخاصة بي باستخدام === وهما متساويان.

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

محاولات رمز البث:

scope.$apply(function() {root.$emit('change', {mode: 1})})
scope.$apply(function() {root.$emit('stateChangeSuccess', {mode: 1})})
root.$apply(function() {root.$emit('change', {mode: 1})})
root.$apply(function() {root.$emit('stateChangeSuccess', {mode: 1})})

بالإضافة إلى ذلك، تجدر الإشارة إلى أن تغيير الإدخال سيؤدي إلى تغيير النطاق وليس نسختي من النطاق الجذر.

root.mode = 'console'
type 'input text' in the input
root.mode returns 'console'
هل كانت مفيدة؟

المحلول

لا أعتقد أن هذا ممكن مع الأحداث (ربما أكون مخطئا).هناك طريقة أخرى لإجراء تغييرات من وحدة التحكم.

السبب angular.element("body").scope().$root.mode = 'test' لا يقوم بتحديث الارتباطات الخاصة بك هو أن Angular لا "يعرف" أنه قد تم إجراء تغيير على النطاق.إذا كنت تقوم بإجراء تحديثات على نموذج البيانات الخاص بك من "خارج" العالم Angular، فستحتاج إلى تضمين التغييرات في ملف $apply() وظيفة:

var $rootScope = angular.element("body").scope().$root;
$rootScope.$apply(function() {
  $rootScope.mode = 'hi';
});

لمعلوماتك، عند إرسال حدث من $rooteScope, ، سوف ترغب في استخدامها $broadcast بدلاً من $emit. $broadcast يبث حدثًا "لأسفل" لجميع النطاقات التابعة، بينما $emit يرسل الحدث "لأعلى" إلى نطاقات الأسلاف.اذا أنت $emit من $rootScope, ، لا توجد نطاقات أسلاف لالتقاط الحدث (على الرغم من أنه ربما يكون $rootScope سوف؟).

نصائح أخرى

إذا كنت أفهمك بشكل صحيح، فإنscope() === $root، وإلا فإنك تقوم ببعض الافتراضات الخاطئة هنا.

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

جرب إحدى هاتين الحيلتين:

1) إما أن تحاول scope.$apply(function(){scope.mode ='test'});

2) $root.mode={name:'test'}; وربط ضد mode.name في HTML

لاحظ أنه يجب أن تكون قادرًا على إطلاق دورة $digest باستخدام $apply على النطاق الجذر ويجب أن تنتشر إلى النطاقات الفرعية أيضًا. $root.$apply();

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top