将指令控制器公开给父控制器

时间:2014-07-14 22:38:43

标签: angularjs

我想通过其控制器公开我的一些指令功能(想想这个指令的公共API)。

return {
        restrict: 'E',
        scope: {},
        controller: function($scope) {
            this.method1 = ...;
            this.method2 = ...;
        },
        controllerAs: 'dir',
        link: function (scope, element, attrs) { ... }
    }

然后在我的父控制器或模板中调用dir.method1以获得在指令内完成的东西。如果从Angular 1.3开始可能有任何想法吗?

我想避免事件传递甚至功能传递,我听说这是可能的,虽然我从未见过这个实现。

2 个答案:

答案 0 :(得分:1)

这是可能的,但您的问题不是弄清楚如何获取API。这是如何从父母那里获得它。您正在使用“范围”选项创建isolate scope。你也在做一个元素类型的指令,所以我猜你正在做这样的事情:

<my-parent>
    <my-child></my-child>
</my-parent>

其中<my-parent>是父指令,而<my-child>是包含您要公开的API的指令。

真正的问题是你在这里想要实现的目标。有一种方法可以做你所要求的。仅仅因为范围是孤立的并不意味着你无法实现它。您可以遍历父$ scope的$$ childHead / etc列表来查找要访问其API的子项。你在孩子中定义的任何东西都是这样的:

$scope.myApiFunction = function() {
};

将在此处显示。 (你投入'this'的东西不会 - 改为使用$ scope存储桶。)

这意味着如果你只有一个孩子,你可以从父控制器做这样的事情:

$scope.$$childHead.myApiFunction();

简单。而且,非常粗糙。这里有很多问题:如果你有很多孩子怎么办?如果这个孩子的API结束了一级怎么办?等等。它打破了所有类型的OO模式,它会变得混乱,快速。

你的问题非常抽象 - 如果你用一个确切的例子更新它可能会很好。没有它,让我猜你的目标。在Angular中有两种方法可以做“像这样”的事情:

  1. 服务。每当你说“API”时,首先考虑服务。服务是单身(自动),因此它是为创建API而量身定制的。并且服务可以使用Factory模式返回一个类型的对象,因此THOSE可以定制为具有管理器服务句柄,比如IM客户端中的好友列表,以及用于创建,删除和查找好友的API方法

  2. 在定义父项时向父项添加“可选”功能的项目。假设我们有三种可能的工具提示类型:具有悬停效果的工具提示,具有点击效果的工具提示,以及按某种顺序由“漫游”系统触发的工具提示。对于这种事情,最简单的方法就是反转API,如下所示:

  3. 家长控制器:

    $scope.tooltipHandler = {
        showTooltip: function() {},
        hideTooltip: function() {}
    };
    

    儿童控制器:

    $scope.$parent.tooltipHandler = {
        showTooltip: function() {
            // Do some real work
        },
        hideTooltip: function() {
            // Do some real work
        },
    }
    

    这里发生的事情是,如果没有定义工具提示,当父级运行其演练时,没有任何反应。如果添加蓝色工具提示显示模块,当父级现在运行其演练时,它将显示蓝色工具提示。

    有意义吗?

答案 1 :(得分:1)

我来到这里寻找类似的回应。到目前为止,我能想到的最好的是做Angular对ngForm的处理。

documentation明确说明

  

如果指定了name属性,则表单控制器将以此名称发布到当前作用域。

这基本上使得表单控制器可以从任何地方访问。

如果您有以下DOM

<div ng-controller="MyCtrl as parentCtrl">
  <form name="parentCtrl.frmCtrl">
     <my-child-directive>
  </form>
</div>

您可以使用require: 'ngForm'中的my-child-directive来获取内部指令的访问权限。如果您在父控制器中,则可以通过frmCtrl变量访问它。

不确定这是否是最佳做法。在ngForm中,name属性运行良好,但我甚至不知道如何为自定义指令调用此类属性。

这就是为什么我来到这里,我想知道这是否是&#34; Angular方式&#34;什么类型的对话是关于这个主题的。

希望它有所帮助!