【问题标题】:I am getting issue in broadcasting and listening event我在广播和收听活动中遇到问题
【发布时间】:2018-03-04 06:06:14
【问题描述】:

First.js

scope.menuItemClick = function (def, callbackText, keepMenuOpen) {

  console.log(def);

  if(def.automationId === "Print"){

  console.log("before broadcast");

  $scope.$root.$broadcast("printingForms","my Data");

  console.log("after broadcast");

}

Second.js

$scope.$on("printingForms",(event, data) => {

  console.log(data);

  console.log("listening");

});

虽然我是从 root 广播它,但我无法收听广播事件。谁能帮我? 谢谢.....

【问题讨论】:

    标签: javascript angularjs typescript angularjs-directive


    【解决方案1】:

    您应该使用$rootScope 来广播事件。只需在你的控制器上注入$rootScope,就像$scope一样

    控制器 1

    $rootScope.$broadcast("printingForms","my Data");
    

    控制器 2

    $rootScope.$on("printingForms",function(event, data){
        console.log(data);
    });
    

    【讨论】:

    • 是的,它总是与 $rootScope 一起工作。那么,如果我用 $rootScope.$broadcast(some stuff) 广播,那么我必须用相同的 $rootScope.$on(some stuff) 收听吗?我可以听 $scope.$on(some stuff) ?????
    • $rootScope 是所有控制器的父级,因此它可以看到所有子级。如果您在控制器之间进行通信,这是最好的方式。
    【解决方案2】:

    值得检查您的 2 个控制器的关系。谁是父母谁是孩子。如果两个控制器并行运行,检查谁加载第一个。

    它可能不起作用的主要原因是在您调用 $scope.$root.$broadcast("printingForms","my Data"); 之后加载了您的第二个控制器

    另外,即使$scope.$root 持有对$rootScope 的引用,使用$rootScope 会更好

    【讨论】:

    • 如何检查谁加载了第一个?我也有同样的疑问。感谢您的回复。
    • @DEVANGPATEL 在控制器第一行打印console.log(),并确保在调用console.log("before broadcast");之前加载Ctrl2
    • 是的,你是对的..ctrl2 之前没有加载...如果发生这种情况,除了 $rootScope 之外我应该做什么?
    • @DEVANGPATEL 您可以更改逻辑以在加载 Ctrl2 后调用 $broadcast。您可以使用$rootScope,但在某些情况下可能会导致意外行为,例如您收到两次$on 回调.etc。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多