如何从父指令/控制器访问指令范围?

时间:2016-03-11 12:09:11

标签: javascript angularjs

我有一个类似这样的模板:

<parent-directive>
    <child-directive binding="varFromParent"></child-directive>
    <button ng-click="parentDirective.save()"></button>
</parent-directive>

parentDirective控制器中执行函数时,是否可以访问和操作childDirective的范围变量,例如angular.module('app').directive('parentDirective', function() { return { restrict: 'E', templateUrl: '...', controllerAs: 'parentDirective', controller: function($rootScope, $scope) { //... this.save = () => { //Need to manipulate childDirective so that its //scope.defaultValue == 'NEW DEFAULT' } } } }); 。如果我将它们设置为如此

angular.module('app').directive('childDirective', function() {
  return {
    restrict: 'E',
    templateUrl: '...',
    scope: {
        binding: '='
    }, 
    controllerAs: 'childDirective',
    link: function(scope, elm, attrs) {
      scope.defaultValue = 'DEFAULT';
    }
  }
});

<child-directive>

我该怎么做呢?有没有办法在不设置双向绑定的情况下执行此操作?如果可能的话,我想避免{{1}}元素上的混乱属性。

2 个答案:

答案 0 :(得分:0)

有很多方法可以在孩子和父母指令之间建立沟通:

  1. 双向绑定(就像你说的那样)

  2. 在您的父母中注册您的孩子

    您可以使用指令require属性和链接函数controllers的最后一个参数来在其父级中注册子级。

  3. 活动,请参阅$scope.on/broadcast

  4. 角色服务(因为它们是&#34;单身&#34;,它很容易用它来在您的指令之间共享数据)

    < / LI>

    2的示例:

    angular.module('Example', [])
    .directive('parent', [function () {
        return {
            controller: function (){
                // registerChildren etc
            }
            // ...
        };
    }])
    .directive('children', [function () {
        return {
            require: ['^^parent', 'children'],
            controller: function (){
                // ...
            }
            link: function ($scope, element, attributs, controllers) {
                ParentController = controllers[0];
                OwnController = controllers[1];
                ParentController.registerChildren(OwnController);
                // ...
            }
            // ...
        };
    }])
    

答案 1 :(得分:0)

在这种情况下,您可能不需要隔离儿童的指令范围。定义一个你需要在父范围内改变的变量,然后子指令范围将继承这个值,这样你就可以在子指令中更改它的值,并且可以从父节点访问它。

student.setName("")

这是小提琴 {{3}}