Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs $compile嵌套指令,从另一个指令中编译_Angularjs_Angularjs Directive - Fatal编程技术网

Angularjs $compile嵌套指令,从另一个指令中编译

Angularjs $compile嵌套指令,从另一个指令中编译,angularjs,angularjs-directive,Angularjs,Angularjs Directive,TL;博士 我想使用两个指令kmOuter和kmInner作为嵌套指令: <div km-outer> <div km-inner></div> <div km-inner></div> <!-- ... --> </div> 这样使用: <button km-child-adder="[km-outer]">Add child</button> .childA

TL;博士

我想使用两个指令kmOuter和kmInner作为嵌套指令:

<div km-outer>
    <div km-inner></div>
    <div km-inner></div>
    <!-- ... -->
</div>
这样使用:

<button km-child-adder="[km-outer]">Add child</button>
.childAdded不再被调用


我怎样才能解决这个问题?或者可能这个设计本身就被破坏了,我应该重新组织我的代码?

对代码进行了一些编辑。链接中给出的代码


检查这是否是您所期望的。

对代码进行了一些编辑。链接中给出的代码


看看这是否是你所期望的。

我想我做到了,借用了@Mobin Skariya的答案

关键是只编译插入的元素,而不是所有元素:

link: function (scope, elem) {
    var target = angular.element(document.querySelector(scope.target));

    angular.element(elem[0]).bind('click', function () {
        var newInner = angular.element('<div km-inner="param"/>');
        target.append(newInner);

        scope.$apply(function () {
            $compile(newInner)(scope);
        });
    });
}

我已经准备好了第三个不相关的指令inserts,ad编译内部指令和工作的双向数据绑定,您会发现它。很好的一点是,第三个指令kmChildAdder可以插入内部指令,从多个独立的控制器进行绑定。

我想我做到了,借用了@Mobin Skariya的答案

关键是只编译插入的元素,而不是所有元素:

link: function (scope, elem) {
    var target = angular.element(document.querySelector(scope.target));

    angular.element(elem[0]).bind('click', function () {
        var newInner = angular.element('<div km-inner="param"/>');
        target.append(newInner);

        scope.$apply(function () {
            $compile(newInner)(scope);
        });
    });
}

我已经准备好了第三个不相关的指令inserts,ad编译内部指令和工作的双向数据绑定,您会发现它。很好的一点是,第三个指令kmChildAdder可以插入内部指令,从多个独立的控制器进行绑定。

这很接近,肯定是一个改进,谢谢。现在的问题是它重新编译了整个kmOuter指令,所以.childAdded被调用n次,其中n=子元素的数量。我希望每一个新来的孩子只叫一次。有什么想法吗?对不起,我没看到:没问题。反正我给了+1,因为你的想法可能有用。这不是我在本例中所需要的。我已经让它明白了我的答案-关键是不编译整个目标,而是只编译angular.element来使用scope.$apply进行正确的绑定。谢谢你的主意!很接近,肯定是进步了,谢谢。现在的问题是它重新编译了整个kmOuter指令,所以.childAdded被调用n次,其中n=子元素的数量。我希望每一个新来的孩子只叫一次。有什么想法吗?对不起,我没看到:没问题。反正我给了+1,因为你的想法可能有用。这不是我在本例中所需要的。我已经让它明白了我的答案-关键是不编译整个目标,而是只编译angular.element来使用scope.$apply进行正确的绑定。谢谢你的主意!
Error: [$compile:ctreq] Controller 'kmOuter', required by directive 'kmInner', 
can't be found!
link: function (scope, elem) {
            console.log(scope);
            var target = document.querySelector(scope.target);
            angular.element(elem[0]).bind('click', function () {
                var newInner = '<div km-inner></div>';
                angular.element(target).append(newInner);
                $compile(target)(scope)
            });
        }
link: function (scope, elem) {
    var target = angular.element(document.querySelector(scope.target));

    angular.element(elem[0]).bind('click', function () {
        var newInner = angular.element('<div km-inner="param"/>');
        target.append(newInner);

        scope.$apply(function () {
            $compile(newInner)(scope);
        });
    });
}