gpt4 book ai didi

angularjs - 在父指令中附加子指令

转载 作者:行者123 更新时间:2023-12-02 21:39:51 25 4
gpt4 key购买 nike

我有一个父指令,我想在链接函数中动态添加子指令。 子指令^需要parentDirective。我可以添加任何 html 元素,但是当我尝试 $compile 我的子指令时,我收到以下错误,它找不到所需的 Controller 。如果我手动添加子指令,它就可以完美工作。

错误:

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', ['$log', '$sce', function($log, $sce) {
return {
restrict: 'E',
scope: {},
require: '^myInput',
link: function (scope, element, 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。因此您会收到错误。

我还建议将指令名称从驼峰命名法更改为蛇形命名法:

<my-input>
<my-key></my-key>
</my-input>

那么编译部分也会改变:

angular.element('<my-key code="'+ key +'" response="'+ value.response +'"></my-key >');

关于angularjs - 在父指令中附加子指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26791597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com