【问题标题】:Angular JS broadcast not getting inside child scopeAngular JS广播没有进入子范围
【发布时间】:2015-09-17 20:38:14
【问题描述】:

请参考-http://jsfiddle.net/U3pVM/18701/

在控制台中,我只看到“outer1”被记录,内部范围没有记录。有什么遗漏吗?

var app = angular.module("myapp", []);

app.controller("outer1", function($scope) {
$scope.$on("newmessage", function() {
        console.log("outer1");
});
$scope.$broadcast("newmessage");
});

【问题讨论】:

    标签: javascript angularjs broadcast


    【解决方案1】:

    这是一个时间问题 - 在父级已经触发 $broadcast 之后初始化子级。如果您使用$timeout 延迟$broadcast,孩子们将收到事件(update fiddle):

    app.controller("outer1", function($scope, $timeout) {
        $scope.$on("newmessage", function() {
                console.log("outer1");
        });
        $timeout(function() { // delay $broadcast using $timeout
            $scope.$broadcast("newmessage");
        }, 0);
    });
    

    【讨论】:

    • @Oro Drori - 很酷,谢谢!除了使用任意超时/间隔,我们可以在孩子初始化后进行广播吗?
    • 还有什么特殊原因为什么超时为“0”,这是我第一次看到。你能解释一下吗?
    • Angular 的初学者,很想知道。无论如何,我问一个没有超时的解决方案的原因是因为我们不为 Ajax 调用使用超时,我们使用延迟/承诺。像这样的东西会更有效率吗?
    • 超时宽度 0 或 undefined 将回调移动到 javascript 命令队列的末尾,而不会添加额外的时间延迟。这意味着它会在未来某个时间发生,当队列到达它时 - detailed explanation
    • 更有效的是根本不使用子控制器。使用嵌套指令,使用属性传递数据,你的生活会更轻松:)
    猜你喜欢
    • 1970-01-01
    • 2014-06-07
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    相关资源
    最近更新 更多