如何访问父指令控制器?

时间:2016-02-17 23:01:21

标签: angularjs angularjs-directive

我有两个指令,比如dir1,dir2。

dir1是一些常用指令。

我将dir2转换为dir1。

这是脚本:

<script>
    var app = angular.module('myapp', []);

    app.directive('dir1', function() {
        return {
            scope: {},
            controller: D1Controller,
            controllerAs: 'd1c',
            transclude: true,
            templateUrl: 'd1template'
        }

        function D1Controller() {
            var vm = this;
            vm.someValue = "some data";
        }
    });

    app.directive('dir2', dir2);
    function dir2() {
        return {
            tempalteUrl: 'dir2t',
            scope: true,
            bindToController: {},
            controller: D2Controller,
            controllerAs: 'mc',
            link: link,
            require: '^dir1'
        }
    }

    D2Controller.$inject = ['$scope']; // <-- injecting something?
    function D2Controller($scope) {
        var vm = this;
        var getDataListener = $scope.$watch('someValue', function fnGetData(someValue) {
            if (!!someValue) {
                vm.data = someValue;
                getDataListener();
            }
        });

        // $scope.$parent.$parent.someValue <-- this will work but seems not elegant way to do it.
    }
    function link(scope, iElement, iAddr, controller) {
        scope.someValue = controller.someValue; // get data form parentDirective controller
    }
</script>

<script type="text/ng-template" id="d1template">
    <div>
    ...
    <div ng-transclude></div>
    ...
    </div>
</script>

我只能访问D1Controller表单dir2的链接函数(控制器)并通过作用域传递给D2Controller。

有没有办法(比如向D2Controller注入东西)从D2Controller访问D1Controller?

或者是否有其他方式在指令范围和转换​​范围之间进行通信?

感谢罗伯特的建议。

这是我的解决方案。

我发现一种优雅的方法是将D2Controller传递给D1Controller并让D1Controller设置数据。

我在D1Controller中添加了set data函数

    vm.setData = function(controller) {
        controller.data = vm.SOMEDATA;
    }

在dir2的链接函数中,我调用d1controller.setData。

function link(scope, iElement, iAttr, controller) {
    controller.setData(scope.mc);
}

0 个答案:

没有答案