Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在子作用域中调用回调的最佳方法是什么?_Javascript_Angularjs - Fatal编程技术网

Javascript 在子作用域中调用回调的最佳方法是什么?

Javascript 在子作用域中调用回调的最佳方法是什么?,javascript,angularjs,Javascript,Angularjs,我有一个页面,它通过多个http请求加载一些数据,然后我必须在此页面内的几个指令中执行一些逻辑。 我想问,在这种情况下,什么是最好的做法? 现在我有一个布尔标志,指示内容已加载。第一个想法是在这些指令中使用timeout来检查每秒是否加载了内容,如果加载了,则执行此逻辑。 第二个想法是利用广播。我喜欢这个想法,但由于这些指令有闭包作用域,就我所知,我必须在$rootScope上广播。据我所知,从生产力的角度来看,这不是最好的主意。 因此,请让我知道什么是此类任务的最佳解决方案。$rootScop

我有一个页面,它通过多个http请求加载一些数据,然后我必须在此页面内的几个指令中执行一些逻辑。
我想问,在这种情况下,什么是最好的做法?
现在我有一个布尔标志,指示内容已加载。第一个想法是在这些指令中使用timeout来检查每秒是否加载了内容,如果加载了,则执行此逻辑。
第二个想法是利用广播。我喜欢这个想法,但由于这些指令有闭包作用域,就我所知,我必须在$rootScope上广播。据我所知,从生产力的角度来看,这不是最好的主意。
因此,请让我知道什么是此类任务的最佳解决方案。

$rootScope.emit()是angular1的最佳方法。这是内置的pubsub模式

$rootscope.emit()作为广播方法并不昂贵,因为广播会渗透所有作用域

只需在控制器中使用emit

$rootScope.$emit('topic');

in directive

$rootScope.$on('topic', function(){})
您可以使用。具体来说,它是
$q.all()
方法

将多个承诺合并为单个承诺,并在 所有输入承诺都已解决


优点是is是“角度原生”的,因此不需要担心与$scope等的同步,这取决于DOM的层次结构。除了
$rootScope
,这些指令是否由公共祖先封装?如果它们都封装在同一个控制器中,您只需执行
$scope.$broadcast
,这具有相同的效果,但仅对当前作用域的子项有效。祖先是同一页控制器的作用域。但是子作用域在层次结构中可能非常低。Like页面包含一个指令,这个指令包含另一个指令,它将收听这个广播。这就是为什么问题是,在页面的作用域上广播还是在根作用域上发射更好?
$emit
可能是最好的选择,因为它只向订阅者发布<代码>$broadcast必须遍历每个子范围。我不理解你的想法。我已经在页面的顶级作用域中使用q.all()来确定何时加载所有数据,并将“loaded”标志设置为true。但这如何帮助我在多个子指令中执行一些逻辑呢?当然,我可以尝试使用数组来传递所有承诺,但我不确定这是否是最干净的解决方案。啊哈。。我懂了。在这种情况下,使用@Piyush.kapoor建议的
$rootScope.$emit