广播rootcope改变

时间:2014-07-29 17:10:05

标签: angularjs google-chrome-devtools rootscope

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

示例:

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

2 个答案:

答案 0 :(得分:2)

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

angular.element("body").scope().$root.mode = 'test'没有更新你的绑定的原因是Angular没有&#34;知道&#34;已经对范围进行了更改。如果您要从&#34;外部&#34;更新您的数据模型在Angular世界中,您需要在$apply()函数中包含更改:

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

仅供参考,从$rooteScope发送活动时,您希望使用$broadcast代替$emit$broadcast广播事件&#34;向下&#34;对于所有后代范围,$emit发送事件&#34;向上&#34;到祖先范围。如果$emit中的$rootScope,则没有祖先范围来接收事件(尽管$rootScope可能会这样做吗?)。

答案 1 :(得分:0)

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

我认为正在发生的是你正在改变根作用域的值,但由于原型继承,你的绑定实际上正在使用另一个作用域(例如,当你绑定它时,字符串属性实际上是在scope()中创建的)。

尝试以下两种技巧之一:

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

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

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