从指令的多个实例共享数据

时间:2015-04-14 21:30:11

标签: angularjs

我有一个可在整个应用程序中重复使用的自定义指令。该指令使用ui-grid,我试图确定"角度方式"允许从应用程序中的任何位置访问网格API。

如果它只是一个实例,我会使用服务在控制器之间共享数据:

var attachments = angular.module('attachments', ['ui.grid']);

// this would be accessible from any of my controllers
attachments.factory('Attachments', function() {
    return {};
});

attachments.directive('attachments', function() {
    return {
        restrict: 'E',
        templateUrl: 'attachments.html', // template has a ui-grid, among other elements
        controller: ['$scope', 'Attachments', function($scope, Attachments) {

            $scope.gridOptions = {
                // ui-grid code here
                onRegisterApi: function( gridApi ) {
                    Attachments.grid = gridApi;
                }
            };
        }]
    };
});

但是,指令可能有多个实例

例如,可能存在此指令的主要实例,一个在模态内,或者一个在侧边栏中,一个在模态中,等等。

我想我可以为该服务添加属性名称空间......

Attachments = {
  libraryGrid: // ...
  someModalGrid: // ...
}

等...

我宁愿避免为每个可能的实例提供服务,例如:

attachments.factory('SomeModalAttachments', function() {
    return {};
});

虽然它会起作用但感觉效率低下。但是,这两种选择都比挖掘模态范围和使用必要的API查找子范围要好得多。

还有其他方法我还没考虑过吗?

1 个答案:

答案 0 :(得分:0)

对我而言,这取决于您的使用模式。

如果您要使用其中的多个,并且应用程序的其他位将访问它们,那么这意味着以下几点之一:

  1. 访问实际上是从网格启动的。因此,您可能有许多列表页面,当前活动的列表页面是您要处理的列表页面。所以我将网格寄存器包含它想要与之交谈的所有内容,并在它再次关闭时取消注册。其他事情都是服务(单身人士)。

  2. 这些网格中有指定数量的网格,您可以通过名称与它们交谈 - 因此您希望与列表页面网格或模态网格或其他内容进行交互。因此,您可以将每个网格注册到某个中心位置(也许是其他所有内容都可以使用的服务)。

  3. 网格是某种东西的附属物。所以页面包含网格指令,然后该页面想要与该网格对话。您可以将对象传递给指令,然后让网格在该对象上注册。因此,您使用" myGridCommunicationObject = {}"调用该指令,然后网格执行" $ scope.myGridCommunicationObject.gridApi = gridApi"。这不会让应用程序的其他位与网格对话,但如果真的只是想要创建网格的任何内容与之交谈,那么它运行良好。

  4. 你可以播放。因此,如果你真的不在乎你与之交谈的网格,你只想与当前可见的任何网格(比如说你正在调整它们或其他东西)进行对话,你可以直接向它们,你所有的网格指令都可以监听那个事件。更进一步,您可以在参数中广播并包含网格ID或名称,然后让每个网格在采取行动之前检查它是否为我。

  5. 说完了所有这些选项之后,还有一些关于你正在做的事情,它有一些代码味道。实际上,应用程序的任意位不应该直接与网格Api通信,它们应该与保存网格的控制器上的方法进行通信。也许你想要做的一些例子会有所帮助,但我觉得模型应该是注册使用其他服务的网格之一(例如调整大小通知),或拥有网格与网格交互的控制器,和其他与该控制器交互的东西。

相关问题