2013-08-30 46 views
1

我有一个服务,使

$rootScope.$broadcast('myEvent', somedata)

不时。在控制器我做

$scope.$on('myEvent', function (evt, somedata) { $scope.data = somedata })

的问题是,如果我省略

if (!$scope.$$phase) { $scope.$apply(); }

在控制器的事件监听器,然后查看不会改变。这是为什么?有没有更好的方法来做到这一点?

+0

您可以发布您的代码? – noj

+0

从你的代码,你真的不需要申请。你能粘贴整个代码吗? – zsong

+0

对不起,迟到了,这是我的代码:http://plnkr.co/edit/zr7asMrCZFEhufXhniy4?p=preview –

回答

0

这是因为$ apply是一个懒惰的工人,只会有足够的东西来刷新工作。你不能控制何时,除非你明确地调用$ scope。$ apply。

是的,有一个更好的方法来做到这一点:打电话safeApply。因为显式调用许多$ apply可能会导致冲突。有没有正式的safeApply实现,所以可以选择你的毒药:

+0

是的,我明白这一点。我的问题是为什么当我更改消息范围时,我的视图不会更新。 '$ $范围上( '信息',功能(例如,数据){' '$ scope.someData =数据;' '//没有这个如果视图不会update' '如果( $ scope。$$ phase){' '$ scope。$ apply();' '}' '});' –

+0

我的意思是,为什么每次遇到事件时都要调用'$ apply',那已经从'$ rootScope'广播过了? –

+0

是的,它属于您必须调用$ apply的范围。不要随时拨打$申请,但如果发生这样的意外事件(来自Rootcope的事件就是其中之一),则无论如何您都必须打电话给它。 – bdavidxyz

相关问题