我将函数作为属性传递给指令时遇到了问题,该指令实现了递归(树)。
我减少了代码以便更容易理解:
控制器:
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),我做了一个解决方法,做一个链接函数并在其中传递一个虚函数。所以我可以在不检查它的情况下触发该函数。