2

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

例子:

<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'
4

2 回答 2

2

我认为事件不可能做到这一点(也许我错了)。不过,还有另一种方法可以从控制台进行更改。

不更新绑定的原因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意志?)。

于 2014-07-29T17:18:54.560 回答
0

如果我理解正确,scope() === $root,否则你在这里做了一些错误的假设。

我相信正在发生的事情是您正在更改根范围的值,但由于原型继承,您的绑定实际上正在使用另一个范围(例如,当您绑定它时,字符串属性实际上是在 scope() 中创建的)。

尝试以下两个技巧之一:

1)要么尝试scope.$apply(function(){scope.mode ='test'});

2)$root.mode={name:'test'};并在 html 中绑定 mode.name

请注意,您应该能够在根作用域上使用 $apply 触发 $digest 循环,并且它也应该向下传播到子作用域。$root.$apply();

于 2014-07-29T17:20:12.410 回答