-
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,否则你在这里做了一些错误的假设。
我相信正在发生的事情是,您正在更改根范围的值,但由于原型继承,您的绑定实际上正在使用另一个范围(例如,当您绑定它时,字符串属性实际上是在scope()中创建的)。
尝试以下两个技巧之一:
1)要么尝试 scope.$apply(function(){scope.mode ='test'});
2) $root.mode={name:'test'};
并绑定到html中的mode.name
请注意,您应该能够在根作用域上使用 $apply 触发 $digest 循环,并且它也应该向下传播到子作用域。 $root.$apply();