基本上,如果我使用ng-include动态加载我的html,当我收听$ on事件时,我无法更新我的控制器信息。 Plunker example.
如果单击一次,您将看到该视图保留原始的$ scope.name。如果再次单击它将更新。
我在广播上放置了一个setTimeout,以确保加载了ng-include。你可以根据需要设置它,并且永远不能在第一次尝试时更新$ scope(至少在我的例子中)。
思想?
编辑:
我正在使用<ng-include="template"></ng-template>
作为一个区域,我可以加载替代内容。如果有更好的方法,请告诉我。
答案 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()。