如何在具有隔离范围的指令中侦听站点范围的事件

2023-12-30

我正在使用具有隔离范围的指令在 angularjs 中创建自定义图表小部件。这个想法是,每个小部件在收到有关如何创建自身的基本配置信息后应该能够独立存在。

该小部件将通过侦听“update.data”事件与应用程序的其他部分进行通信。当事件被触发时,小部件知道根据通过事件对象传递的可用的新配置信息来刷新其数据(调用服务器)。

创建的示例小部件如下

 ng.directive('metricOverview', ['Report', function(Report) {
        return {
            restrict: 'EA',
            //replace: true,
            scope: {
                title: '@',
                metrics: '=',
                report: '@'
            },
            templateUrl: 'scripts/widgets/metric-overview/metric-overview.html',
            controller: function($scope, $element)
            {
            },
            link: function(scope, element, attrs) {
                scope.$on("update.data", function()
                {
                    Report.overview({metric: scope.metric, report: scope.report})
                            .$promise.then(function(result) {
                                console.log(result);

                                $(document).trigger("chart.refresh", result);

                            });
                });

            }
        };
    }]);

我的问题是哪里最适合触发“update.data”事件。例如,当页面加载并且 DOM 准备就绪时,我希望触发此事件,并且所有加载的小部件应该能够侦听该事件并自行更新。我无法在 rootScope 上触发事件,因为在指令的隔离范围内无法访问它。

做了一些研究,但我发现的大部分内容都依赖于全局/父范围的使用,由于指令的孤立性,这不符合我的目的

解决这个问题的最佳方法是什么?


您可以使用使用 rootscope 和 $emit 的 eventbus 服务来处理这种情况,这样事件就不会进入很多子作用域。您可以将此服务注入指令中并添加事件侦听器。

(function (angular) {
'use strict';

/**
 * @ngdoc service
 * @name coreModule.eventbus
 * @requires $rootScope
 *
 * @description
 * Provides a eventing mechanism when a user cna broadcast and subscribe to application wide events.
 */
angular.module('coreModule').factory('eventbus', [
    '$rootScope',
    function ($rootScope) {
        /**
         * @ngdoc function
         * @name subscribe
         * @methodOf coreModule.eventbus
         *
         * @description
         * Subscribes a callback to the given application wide event
         *
         * @param {String} eventName The name of the event to subscribe to.
         * @param {Function} callback A callback which is fire when the event is raised.
         * @return {Function} A function tht can be called to unsubscrive to the event.
         */
        var subscribe = function (eventName, callback) {
                return $rootScope.$on(eventName, callback);
            },

            /**
             * @ngdoc function
             * @name broadcast
             * @methodOf coreModule.eventbus
             *
             * @description
             * Broadcasts the given event and data.
             *
             * @param {String} eventName The name of the event to broadcast.
             * @param {object} data A data object that will be passed along with the event.
             */
            broadcast = function (eventName, data) {
                $rootScope.$emit(eventName, data);
            };

        return {
            subscribe: subscribe,
            broadcast: broadcast
        };
    }
]);
}(angular));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在具有隔离范围的指令中侦听站点范围的事件 的相关文章

随机推荐

  • 相当于其他编译器中 MSVC 的 _countof 吗?

    是否有任何内置的等价物 countof http msdn microsoft com en us library ms175773 v VS 100 aspx由其他编译器提供 特别是 GCC 和 Clang 有没有非宏观形式 使用C 11
  • 理解 sklearn CountVectorizer 中的“ngram_range”参数

    我对如何在 Python 的 scikit learn 库中使用 ngrams 有点困惑 具体来说 如何ngram range参数在 CountVectorizer 中工作 运行这段代码 from sklearn feature extra
  • 等待 Task.Run 与等待

    我在网上搜索了一下 看到很多关于Task Run与await async相比 但是有一个特定的使用场景 我不太理解其中的区别 我相信场景很简单 await Task Run gt LongProcess vs await LongProce
  • C# 拖放:拖动时显示拖动的项目

    我正在使用 C 和 Windows 窗体构建桌面应用程序 我有一个自定义控件 我希望能够将其拖放到我的应用程序内 而不是外部 现在我正在使用通常的 DoDragDrop OnDragOver OnDragDrop 方法来实现它 有没有什么方
  • 如何在php mysql中获取结果的所有行?

    在我的表中我有 2 条记录companyid 1 但是当我运行下面的 php 时companyid 1它只返回第一个 如何获取所有记录 php 文件 if isset GET companyid companyid GET companyi
  • R:将数据帧转换为三维数组?

    我想转换一个数据框 例如 day lt c 1 1 1 2 2 2 3 3 3 area lt c A B C area lt rep area 3 measure1 lt c 99 97 95 102 105 98 103 98 90 m
  • 查找将两个 Numpy 数组平均划分的值

    我有两个数组 x1 and x2 具有相同长度且具有重叠的值范围 我需要找到一个值q这样l1 l2被最小化 并且 l1 x1 np where x1 gt q shape 0 l2 x2 np where x2 lt q shape 0 我
  • FragmentActivity 中的“setSupportActionBar(toolbar)”?

    我如何访问setSupportActionBar Toolbar toolbar inside FragmentActivity 我无法访问里面的内容FragmentActivity toolbar Toolbar findViewById
  • Phoenix 和 Ecto 以及 SELECT

    我在凤凰城建立了一个 Ecto 模型协会 一个组织有许多组织成员 在 OrganizationMember 控制器的 Edit 方法中 我尝试创建一个 SELECT 元素来保存所有可供选择的组织 在里面edit定义 我有以下两行 organ
  • 为什么使用“composer create-project”创建项目后,依赖项不是最新的可用版本?

    因为某些原因 composer create project命令似乎会拉出过时的依赖项版本 运行后create project if I chdir创建文件夹并运行composer update 下载较新的版本 aherne aherne
  • R 将数据框从长格式重塑为宽格式? [复制]

    这个问题在这里已经有答案了 将下面的数据帧从长格式转换为宽格式的最佳方法是什么 我尝试使用重塑但没有得到预期的结果 2015 PROD A test1 2015 PROD A blue 2015 PROD A 50 2015 PROD A
  • Cython 中是否可以使用 C++ 风格的内部 typedef?

    在 C 中 可以声明作为类或结构成员的类型别名 struct Foo internal type alias typedef int DataType 有没有办法在 Cython 中做同样的事情 我尝试过最明显的方法 cdef struct
  • SystemInfo - 通过 CMD 获取计算机系统模型 - 额外空格错误

    我正在尝试通过批处理文件获取计算机系统模型类型 为此我创建了这个脚本 systeminfo find System Model gt temp TEMPSYSINFO txt for F tokens 2 delims a in temp
  • 验证 Spring Web 应用程序配置的最佳实践

    我希望我的基于 Spring 的 Web 应用程序能够validate它在启动期间的配置 这意味着例如 检查是否所需文件夹存在并且可读 可写 检查是否符合要求配置键已设定且一致 检查任何其他约束这是正确运作所必需的 您如何执行这些检查和no
  • 如何从 Quart 获取事件循环

    你好 我对 Python 相当陌生 我正在尝试将 Flask 上的现有应用程序转换为 Quart https gitlab com pgjones quart https gitlab com pgjones quart 它应该构建在 as
  • 使用 SVM 进行实时面部表情分类

    我目前正在开发一个项目 我必须提取用户的面部表情 一次只能从网络摄像头提取一个用户 例如悲伤或快乐 我对面部表情进行分类的方法是 使用opencv检测图像中的人脸 使用ASM和stasm获取面部特征点 现在我正在尝试进行面部表情分类 SVM
  • LNK2019 错误 C++ 无法解析的外部符号

    我收到这些错误消息 错误1错误LNK2019 未解决 外部符号 public void thiscall ArrayIntStorage sortOwn void sortOwn ArrayIntStorage QAEXXZ 函数中引用 m
  • 莱斯的教学目的?

    目的是什么les汇编指令 为什么我们需要加载es部分and寄存器 书中给出了以下例子 les bx p Load p into ES BX mov es bx al Store away AL 为什么我们需要加载es and bx在这种情况
  • node.js 检查远程 URL 是否存在

    如何在不下拉的情况下检查 URL 是否存在 我使用以下代码 但它会下载整个文件 我只需要检查它是否存在 app get api v1 urlCheck function req res var url req query url var r
  • 如何在具有隔离范围的指令中侦听站点范围的事件

    我正在使用具有隔离范围的指令在 angularjs 中创建自定义图表小部件 这个想法是 每个小部件在收到有关如何创建自身的基本配置信息后应该能够独立存在 该小部件将通过侦听 update data 事件与应用程序的其他部分进行通信 当事件被