angularjs – 在父指令中附加子指令
发布时间:2020-12-17 07:41:08 所属栏目:安全 来源:网络整理
导读:我有一个父指令,我想在链接函数中动态添加子指令.子指令^需要parentDirective. 我可以添加任何html元素,但一旦我尝试$编译我的孩子指令,我得到以下错误,它找不到所需的控制器.如果我手动添加子指令,它完美地工作. 错误: Error: [$compile:ctreq] Controller
我有一个父指令,我想在链接函数中动态添加子指令.子指令^需要parentDirective.
我可以添加任何html元素,但一旦我尝试$编译我的孩子指令,我得到以下错误,它找不到所需的控制器.如果我手动添加子指令,它完美地工作. 错误: Error: [$compile:ctreq] Controller 'myInput',required by directive 'myKey',can't be found! 添加元素后,我的模板应该是这样的: <myInput> <myKey></myKey> <-- added dynamically <myKey></myKey> <-- added dynamically <myKey></myKey> <-- added dynamically .... </myInput> myInput指令: angular.module('myModule').directive('myInput',['$log','$templateCache','$compile',function($log,$templateCache,$compile) { return { restrict: 'E',transclude: true,scope: { service: '=',// expects a stimulus object provided by the tatoolStimulusService onkeydown: '&' // method called on key press },controller: ['$scope',function($scope) { this.addKey = function(keyCode,value) { $scope.service.addInputKey(keyCode,{ givenResponse: value }); }; }],link: function (scope,element,attr) { // add keys directives angular.forEach(scope.service.registeredKeyInputs,function(value,key) { var keyEl = angular.element( $compile('<myKey code="'+ key +'" response="'+ value.response +'"></myKey >')($rootScope)); element.children(":first").append(keyEl); }); },template: '<div ng-transclude></div>' }; }]); myKey指令: angular.module('myModule').directive('myKey','$sce',$sce) { return { restrict: 'E',scope: {},require: '^myInput',attr,myCtrl) { myCtrl.addKey(attr.code,attr.response); // ... },template: '<div class="key"><span ng-bind-html="key"></span></div>' }; }]);
将compile-append操作的顺序更改为append-compile:
var keyEl = angular.element('<myKey code="'+ key +'" response="'+ value.response +'"></myKey>'); element.append(keyEl); $compile(keyEl)(scope); 显然,在这种情况下(定位父元素指令)很重要,正在编译的新元素已经在DOM中. 除非DOM元素附加到DOM,否则它不具有父(其parentNode属性为null).当Angular查找^ myInput时,它会遍历DOM树,直到找到具有必需指令的节点.如果元素不在DOM中,则此搜索将立即失败,因为元素没有单个parentNode.因此你得到的错误. 另外我建议将您的指令的名称从camelCase更改为snake-case: <my-input> <my-key></my-key> </my-input> 那么编译部分也会改变: angular.element('<my-key code="'+ key +'" response="'+ value.response +'"></my-key >'); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 无法使用leaflet弹出窗口与angularjs指令(和部分)一起使用
- 单元测试 – Angular 2 RC6:’pattern-list’不是已知元素
- scala – 单个对象的protected [package]和private [packag
- twitter-bootstrap – 如何在Laravel 4的表单中使用Twitter
- Scala 2.9中的案例类和代理行为
- Angular 5 快速入门与提高
- 斯卡拉 – “没什么”的承诺永远不会完成?
- 从KnockoutJS用户的角度来看,Angularjs中的viewmodel及其结
- 如何在IE上修复twitter-bootstrap?
- EditPlus编译和运行java代码