我正在尝试编写一个脚本来访问根范围并更改开发工具中的变量值。我可以获取范围和根范围,但我的更改不会显示在我的绑定中。但是,如果我使用绑定输入,一切都很好。

例子:

<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();

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top