Angularjs 可以在两个隔离的指令之间共享控制器吗?

Angularjs 可以在两个隔离的指令之间共享控制器吗?,angularjs,angularjs-directive,angularjs-controller,Angularjs,Angularjs Directive,Angularjs Controller,我有一个时间框架的代码,它显示一个标签,左边是信息,右边是事件信息。时间框架中的每种时间线类型都有两个标记/事件指令,它们本身使用一个抽象指令 我正在添加折叠标记/事件对的功能,并希望有一种比将折叠的从abstractTag的控制器中传递出去更干净的方法,进入时间线标记foo/时间线事件foo之间的共享控制器,并返回到abstractEvent使用的重复abstractTimelineCtrl 我希望能够在每对不同的abstractTag和abstractEvent指令之间共享abstractT

我有一个时间框架的代码,它显示一个标签,左边是信息,右边是事件信息。时间框架中的每种时间线类型都有两个标记/事件指令,它们本身使用一个抽象指令

我正在添加折叠标记/事件对的功能,并希望有一种比将折叠的abstractTag的控制器中传递出去更干净的方法,进入时间线标记foo/时间线事件foo之间的共享控制器,并返回到abstractEvent使用的重复abstractTimelineCtrl

我希望能够在每对不同的abstractTagabstractEvent指令之间共享abstractTimelineCtrl的实例。这目前只适用于abstractTag,但我还没有弄清楚如何为相应的abstractEvent提供与abstractTimelineCtrl相同的实例。任何想法都将不胜感激

HTML:


控制器不是单例的,每次Angular遇到构造函数时都会创建一个新版本的控制器。因此,虽然可以在两个隔离作用域指令中使用同一控制器,但不能使用同一控制器的同一实例

在AngularJS中,服务是单例的,因此如果您需要共享数据(
$scope
),最好通过这种方式传递数据,而不是依赖于控制器


在不使用服务的情况下,最好的办法是继续将隔离作用域绑定到其父作用域,然后再绑定到另一个作用域,但这样可能会得到一些不可靠的结果。

我最终选择了服务修复。对于我的用例来说,这有点黑客,但它似乎在做我需要的事情。谢谢你的建议。
<ul id="tags">
    <timeline-tag-foo>
        <abstract-tag></abstract-tag>
    </timeline-tag-foo>

    <timeline-tag-bar>
        <abstract-tag></abstract-tag>
    </timeline-tag-bar>
</ul>

<div id="scrollContainer">
    <div id="events">
        <timeline-event-foo>
            <abstract-event></abstract-event>
        </timeline-event-foo>

        <timeline-event-bar>
            <abstract-event></abstract-event>
        </timeline-event-bar>
    </div>
</div>
angular.module('abstractTimeline', [])
.directive('abstractTag', [
    function() {
        restrict: 'E',
        bindToController: true,
        controller: 'abstractTimelineCtrl',
        scope: {
            name: '@'
        },
        templateUrl: 'abstractTimeline/abstractTag.html',
        transclude: true
    }
])
.directive('abstractEvent', [
    function() {
        restrict: 'E',
        scope: {
            width: '@'
        },
        templateUrl: 'abstractTimeline/abstractEvent.html',
        transclude: true
    }
])
.controller('abstractTimelineCtrl', [
    function() {
        var vm = this;
        vm.collapsed = false;
    }
]);