与ng-include一起使用时,$on不与$Scope通信



基本上,如果我使用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()。

恰好

最新更新