تغيير نطاق البث
-
21-12-2019 - |
سؤال
أحاول كتابة برنامج نصي للوصول إلى نطاق الجذر وتغيير قيمة المتغيرات من أدوات التطوير.يمكنني الحصول على النطاق والجذر، لكن التغييرات التي أجريتها لا تظهر في روابطي.ومع ذلك، إذا استخدمت مدخلاً منضمًا، فكل شيء على ما يرام.
مثال:
<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();