Html 控制器和函数如何使用.emit在两个单独的文件之间通信,以及如何在AngularJS中告知控制器层次结构?

Html 控制器和函数如何使用.emit在两个单独的文件之间通信,以及如何在AngularJS中告知控制器层次结构?,html,css,asp.net,angularjs,Html,Css,Asp.net,Angularjs,这是我关于堆栈溢出的第一篇文章,所以我对AngularJS和ASP.Net非常熟悉,而且对$rootscope.$emit有很多问题。从我在线阅读的内容来看,$rootscope是父作用域,因此所有暴露在那里的值对所有控制器都可见,模板和作用域是控制器内部的函数。似乎您可以通过使用$rootscope.$emit(“函数名$rootscope.on的名称”)通过控制器层次结构向上“发出”对另一个控制器的调用,$rootscope.on侦听该调用,然后执行其函数中的任何操作。我遇到的麻烦是当我做我

这是我关于堆栈溢出的第一篇文章,所以我对AngularJS和ASP.Net非常熟悉,而且对$rootscope.$emit有很多问题。从我在线阅读的内容来看,$rootscope是父作用域,因此所有暴露在那里的值对所有控制器都可见,模板和作用域是控制器内部的函数。似乎您可以通过使用$rootscope.$emit(“函数名$rootscope.on的名称”)通过控制器层次结构向上“发出”对另一个控制器的调用,
$rootscope.on
侦听该调用,然后执行其函数中的任何操作。我遇到的麻烦是当我做我的

$rootscope.$emit("LoadPrintDetailsModal", {}); 
它似乎永远也达不到

$rootscope.$on("LoadPrintDetailsModal", function(event,args) {}. 
所以问题是我是否误解了$emit或控制器层次结构是如何工作的,或者我的代码中是否存在问题

我已经尝试过使用emit,在Index.cshtml文件中的一个按钮调用后,我点击了indexController.js文件中的调试器,但是当我执行

$rootScope.$emit("LoadPrintDetailsModal", {});
它不会被我的printableController.js文件拾取,其中

$rootScope.$emit("LoadPrintDetailsModal", function (event, args) {});
//(Index.cshtml)Index.cshtml文件中调用indexController中的“LoadPrintModal”//函数的按钮

<button type="button" data-toggle="modal" data-target="#dvPrintModal"
        ng-click="LoadPrintModal()">
  Print
</button>
//(printableController.js)文件,其中rootScope.on位于该文件中,并且应该拾取发射

app.controller('PrintableController', function ($scope, $rootScope) {
    $rootScope.$on("LoadPrintDetailsModal", function (event, args) {
        debugger;
        $scope.printModal();
    });

    $scope.printModal = function () {
        console.log("Hello World");
    };
)};

预期结果应该是hello world的控制台日志,我们应该点击printableController.js文件中的调试器。如果没有以下内容,很难知道发生了什么:

  • 查看组件的层次结构。是发射组件在层次结构中位于捕捉组件的下方<代码>$emit正在向上发送消息<代码>$browdcast正在向下发送消息

  • 查看如何注入
    $rootscope

  • 关于2<代码>$rootscope注入为您提供应用程序的主要$scope。从它执行
    $emit
    不会给我们带来任何好处,因为
    $rootScope
    上方没有
    $scope


    我猜您想要注入
    $scope
    ,它表示该控制器/组件层次结构中的特定范围。然后,
    $emit
    将正确地向上传播到捕捉控制器/组件

    使用
    $rootScope.$broadcast

    $rootScope.$broadcast("LoadPrintDetailsModal", {});
    
    $broadcast
    方法将事件分派到继承者权限范围内

    $emit
    方法将事件分派给继承人

    有关详细信息,请参阅


    要捕获广播事件,请在上使用
    $scope.$on

    app.controller('PrintableController', function ($scope, $rootScope) {
        ̶$̶r̶o̶o̶t̶S̶c̶o̶p̶e̶.̶$̶o̶n̶(̶"̶L̶o̶a̶d̶P̶r̶i̶n̶t̶D̶e̶t̶a̶i̶l̶s̶M̶o̶d̶a̶l̶"̶,̶ ̶f̶u̶n̶c̶t̶i̶o̶n̶ ̶(̶e̶v̶e̶n̶t̶,̶ ̶a̶r̶g̶s̶)̶ ̶{̶
        $scope.$on("LoadPrintDetailsModal", function (event, args) {
            debugger;
            $scope.printModal();
        });
    
        $scope.printModal = function () {
            console.log("Hello World");
        };
    )};
    
    从文档中:

    仅对原子事件使用
    $broadcast()
    $emit()
    $on()
    在整个应用程序中全局相关的事件(例如用户身份验证或应用程序关闭)。如果您想要特定于模块、服务或控件的事件,则应考虑服务、指令控制器或第三方LIBS/P>
    • 直接注入服务和调用方法对于直接通信也很有用
    • 指令能够直接通信
    有关更多信息,请参阅seed

    app.controller('PrintableController', function ($scope, $rootScope) {
        ̶$̶r̶o̶o̶t̶S̶c̶o̶p̶e̶.̶$̶o̶n̶(̶"̶L̶o̶a̶d̶P̶r̶i̶n̶t̶D̶e̶t̶a̶i̶l̶s̶M̶o̶d̶a̶l̶"̶,̶ ̶f̶u̶n̶c̶t̶i̶o̶n̶ ̶(̶e̶v̶e̶n̶t̶,̶ ̶a̶r̶g̶s̶)̶ ̶{̶
        $scope.$on("LoadPrintDetailsModal", function (event, args) {
            debugger;
            $scope.printModal();
        });
    
        $scope.printModal = function () {
            console.log("Hello World");
        };
    )};