我正在尝试编写一个脚本来访问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'
答案 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();