在子指令上调用方法的Angular指令

时间:2017-02-06 23:58:02

标签: javascript angularjs angularjs-directive parent-child

我正在寻找有关如何在Angular中实现层次结构的建议,其中指令(<partition>)可以在子指令的控制器(<property-value>)上调用方法。

我在这里列举了一个详细的例子:
https://jsfiddle.net/95kjjxkh/1/

如您所见,我的代码包含一个外部指令<partition>,它在...中显示一个或多个<property-value>指令。

<property-value>指令提供了一种编辑方法editItem(),允许用户更改单个条目的值。 (为了让我的例子简短,我只是在这里指定一个随机数,但在我的生产应用程序中,会出现一个模态,以查询用户的新值。)

这很好用。但是,在外部指令<partition>中,我想添加创建新的空<property-value>指令的功能,然后立即调用其编辑方法,以便用户可以输入初始值。如果未输入初始值,则将丢弃新项目。

我已经看到了内部指令调用封闭指令的方法的例子,但不是相反。

有办法做到这一点吗?或者,有没有更好的方法来构建这种视图?

3 个答案:

答案 0 :(得分:0)

你总是可以使用$ broadcast来双向交谈。给你的父母以及你的孩子。

答案 1 :(得分:0)

在您的儿童控制器中,您可以执行以下操作

  app.directive('propertyValue', function() {
return {
    require : '^partition'
    restrict: 'E',
    scope: {
        item: '='
    },

有了这个,你将获得子指令的链接函数中的父控制器,如下所示

link:function(scope,element,attrs,partitionCtrl){
  partitionCtrl.getChildCtrl(element)
  }

在分区控制器中创建getChildCtrl函数并使用该调用“propertyvalue”控制器函数

 controller: function ($scope, ItemFactory) {
 // your code
var propValueCtrl =undefined;
 this.getChildCtrl =function(elem)
 {
   propValueCtrl = elem.controller();
 }
 this.callChildFunction = function()
 {
    propValueCtrl.Edit();// whatever is the name of function
 }

在属性链接功能需要时调用此函数。

希望这有帮助。

答案 2 :(得分:0)

您可以使用$rootScope.$broadcast();来执行此操作 试试控制器和指令的代码:

var app = angular.module('miniapp', []);

app.directive("addCheckbox", function() {
      return {
            "restrict": "E",
            "replace": true,
            "scope": true,
            "template": '<div><div class="checkContainer"><input type="checkbox" ng-model="checkboxChecked"></div><div>{{!!checkboxChecked}}</div></div>',
            "link": function($scope, $elem, attrs) {
                   $elem.bind("click", function() {
                         $scope.checkboxChecked = !$scope.checkboxChecked;
               })

         $scope.$on("changeCheckbox", function(event, args) {
           $scope.checkboxChecked = !$scope.checkboxChecked;
         })
        } 
    }
})

app.controller("myController", function($scope, $rootScope) {
    $scope.changeCheckbox = function() {
        $scope.checkboxChecked = !$scope.checkboxChecked;
        $rootScope.$broadcast('changeCheckbox', {});

    }
})

Working Fiddle Demo