AngularJs - 为什么$ emit不能从我的弹出窗口中运行

时间:2014-12-03 00:31:50

标签: angularjs emit

我正在使用bootstrap弹出模式窗口,并尝试$ emit和event但由于某种原因主页未检测到该事件。这是一个非常简单的设置,但我无法弄清楚原因。从我在查看Batarang时可以看出,弹出窗口显示主应用范围的子范围,所以我认为它会起作用,但它不会。在这个简单的应用程序中按“确定”时在弹出窗口中,它应该在父范围中设置一个值。这是一个吸烟者:

http://plnkr.co/edit/F2W1LaWSsqinaFpiISAr?p=preview

//Here's code where $emit is called in the child (Factory):
var modalInstance = $modal.open({
                templateUrl: 'popupMyWindow.html',
                pScope: parentScope,
                controller: 
                    function($scope, $modalInstance){
                        $scope.ok = function () {
                            $scope.$emit('ModalSelect', 'hello world');
                            $modalInstance.close(null);
                        }
                    },

//Here's where $on is called in the main controller:
 $scope.$on('ModalSelect', function (event, selected) {
            console.log('ModalSelect called successfully');
            $scope.selectedValue = selected;
        });

谢谢!

1 个答案:

答案 0 :(得分:5)

我不确定将$scope传递给服务是个好主意。 $scope与视图中的位置非常相关,因此您真的知道自己应该$emit还是$broadcast?此外,当您通过$scope时,单元测试更加困难。相反,传递一个回调函数。

话虽如此,你在$emit指令的范围内调用$modal,这可能是一个孤立的范围(我不知道该指令是如何定义的)所以它永远不会到达父节点。

所以你可以这样做:

parentScope.$emit('ModalSelect', 'hello world');

或者,您可以使用$rootScope

$scope.$root.$broadcast('ModalSelect', 'hello world');