AngularJS以递归方式将函数传递给指令

时间:2016-02-25 12:58:51

标签: javascript angularjs scope directive

我将函数作为属性传递给指令时遇到了问题,该指令实现了递归(树)。

我减少了代码以便更容易理解:

控制器:

vm.addNode = addNode;
vm.editNode = editNode;
vm.deleteNode = deleteNode;

function addNode(node) {
}

function editNode(node) {
}

function deleteNode(node) {
}

HTML:

<tree on-add="vm.addNode(node)"
      on-edit="vm.editNode(node)"
      on-delete="vm.deleteNode(node)"></tree>

因此。如果我没有delcare一个函数,例如on-add如:

<tree on-edit="vm.addNode(node)"
      on-delete="vm.editNode(node)"></tree>

指令属性'onAdd'将是未定义的。只有在第一次调用该指令时才会发生这种情况。如果指令自身传递on-add函数(应该是未定义的),则定义'child-directives'中的onAdd-attribute(函数)。 指令:

(function () {
  'use strict';

  angular
    .module('app')
    .directive('tree', Tree);

  function Tree() {
    return {
      restrict: 'E',
      templateUrl: 'tree.html',
      controller: TreeController,
      controllerAs: 'vm',
      bindToController: true,
      scope: {
        'onAdd': '&?',
        'onEdit': '&?',
        'onDelete': '&?'
      }
    };

   function TreeController() {
      var vm = this;  

      console.log(vm.onAdd); // Is undefined on first call (because of &? -> that's good)
                             // PROBLEM HERE: called recursiv, it will be a function again
   }
  }
})();

指令-HTML:

<tree on-add="vm.onAdd({'node': node})"
      on-edit="vm.onEdit({'node': node})"
      on-delete="vm.onDelete({'node': node})"></tree>

//更新:

我知道为什么,因为在指令中,我声明了on-add属性。 Angular在函数中包装vm.onAdd(应该是未定义的)。因此,child-directive将onAdd作为函数而不是undefined。

有人有一个解决方案可以将其作为未定义传递给每个子指令??

//更新2:

如果没有设置任何属性(on-add,on-edit,on-delete),我做了一个解决方法,做一个链接函数并在其中传递一个虚函数。所以我可以在不检查它的情况下触发该函数。

0 个答案:

没有答案