当与ng-include一起使用时,$ on与$ Scope无法通信

时间:2014-06-22 00:51:15

标签: angularjs angularjs-scope

基本上,如果我使用ng-include动态加载我的html,当我收听$ on事件时,我无法更新我的控制器信息。 Plunker example.

如果单击一次,您将看到该视图保留原始的$ scope.name。如果再次单击它将更新。

我在广播上放置了一个setTimeout,以确保加载了ng-include。你可以根据需要设置它,并且永远不能在第一次尝试时更新$ scope(至少在我的例子中)。

思想?

编辑:

我正在使用<ng-include="template"></ng-template>

作为一个区域,我可以加载替代内容。如果有更好的方法,请告诉我。

3 个答案:

答案 0 :(得分:2)

setTimeout()是一个不受AngularJS控制的函数,因此AngularJS在回调运行后不会自动运行digest。这意味着,您的$rootScope.$broadcast()已经运行,但AngularJS没有意识到这一点。下次使用$rootScope.template = '....';时,将运行摘要,并且视图已更新为上一次运行的模型。

要解决此问题,您需要在$scope.$apply()回调结束时手动调用setTimeout(),或使用setTimeout()的角度包装版本{{1}之后会自动运行摘要。

有关摘要/申请的更多详情,请参阅docs

答案 1 :(得分:1)

如果您使用$timeout而不是setTimeout,它对我有用。你应该用于角度应用。

$timeout(function(){
     $rootScope.$broadcast('BROADCAST', param);
}, 1000);

如果您尝试做类似的事情,那么您的设计肯定存在问题。如果你能更好地解释你想要实现的目标,也许有人可以建议一个替代解决方案。因为您无法知道超时应该的时间。

答案 2 :(得分:0)

一些事情:

1)首先,不要在广播函数中定义$ scope.template。在设置该值之前,ngInclude将没有要显示的文件;因此,从我的角度来看,模板将无法在它之前进行更改并且加载控制器。

2)您实际上从未将控制器C2应用于ngInclude。你可以这样做:

  <ng-include src="template" ng-controller="c2"></ng-include>

一旦我做了这两件事,代码就会在第一次工作和更新,而根本不需要使用setTimeout()。

Plunker