基本上,如果我使用ng-include动态加载html,当我侦听$on事件时,我无法更新控制器信息。砰砰作响的例子。
如果您单击一次,您将看到视图保留原来的$scope.name。如果你再次点击,它将更新。
我在广播上设置了一个setTimeout来确保ng-include被加载。你可以把它设置成你想要的长度,并且在第一次尝试时永远无法更新$作用域(至少在我的例子中)。
想法吗?
编辑:我用<ng-include="template"></ng-template>
作为一个区域,我可以加载替代内容。如果有更好的方法,请告诉我。
setTimeout()
是一个不受AngularJS控制的函数,所以AngularJS不会在回调运行后自动运行digest
。这意味着,你的$rootScope.$broadcast()
运行了,但是AngularJS没有意识到这一点。下次使用$rootScope.template = '....';
时,将运行摘要,并将视图更新为前一次运行的模型。
要解决这个问题,您需要在setTimeout()
回调结束时手动调用$scope.$apply()
,或者使用angular包装的setTimeout()
版本,即$timeout()
,它将在之后自动运行摘要。
有关digest/apply的详细信息,请参阅文档:
它适用于我,如果你使用$timeout
而不是setTimeout。你应该在angular应用中使用它。
$timeout(function(){
$rootScope.$broadcast('BROADCAST', param);
}, 1000);
如果你想做这样的事情,你的设计肯定有问题。如果你能更好地解释你想要达到的目标,也许有人会提出另一种解决方案。因为你不可能知道应该是多长时间
几点:
1)首先,不要定义$作用域。模板中的广播函数。在设置了这个值之前,ngInclude不会有文件显示;因此,在我看来,模板在加载它和控制器之前不能进行更改是有道理的。
2)你从来没有真正应用控制器C2到ngInclude。你可以这样做:
<ng-include src="template" ng-controller="c2"></ng-include>
一旦我做了这两件事,代码工作和更新第一次没有使用setTimeout()。
恰好