2014-06-19 111 views
2

我想創建一個div的可能無限樹。遞歸和無限ng-repeat

這就是我實際上做:

<div ng-repeat="block in blocks"> 
    <p class="blocke" > {{block.title}} </p> 
    <input class="childButton" ng-model="childName[$index]" type="text" placeholder="child name"> 
    <button class="childButton" ng-click="addChild($index)" >Add child to {{block.title}} </button> 
</div> 

但在塊每一塊有子塊陣列等。

我想爲每個現有的塊創建與上面相同的div。在任何級別。

有沒有簡單的方法來做到這一點?

回答

2

創建自定義指令,該指令在存在子項時調用自身。這與一些編輯應該工作:

app.directive('block', ['$compile', function ($compile) { 
    return { 
    restrict: 'E', 
    replace: true, 
    scope: { 
     block: '=' 
    }, 
    template: '<div>' + 
     '<p class="blocke"> {{block.title}} </p>' + 
     '<input class="childButton" ng-model="childName[$index]" type="text" placeholder="child name">' + 
     '<button class="childButton" ng-click="addChild($index)" >Add child to {{block.title}} </button>' + 
    '</div>', 
    link: function($scope, $element) { 
     if (angular.isArray($scope.block.childs) && $scope.block.childs.length > 0) { 
     $element.append('<block ng-repeat="childBlocks in block.childs" block="childBlocks"></block>'); 
     $compile($element.contents().last())($scope); 
     } 
    } 
    }; 
}]); 

使用<block ng-repeat="block in blocks" block="block></block>

工作原理:指令替換您的要素與指令模板的意見,然後檢查是否有對模塊項目的一些孩子的,如果是這樣,追加塊元素(指令本身)並編譯它。

這個特殊的代碼沒有經過測試,但這就是我在類似情況下所做的。

+0

我喜歡理解這個指令,但有一個問題。至少這對我來說是一個問題。在你測試的鏈接函數中,如果$ scope.block.childs是一個數組,但是我確實有這樣一個塊數組:$ scope.block = [{'title':'','childs':[]}]例如。所以我需要檢查$ scope.block [index] .childs。我該怎麼做,用哪個索引? – Cratein

+0

在這種情況下,您不需要索引。當在block中使用'ng-repeat ='塊時,你也通過'block =「block」'屬性傳遞當前塊項目,所以每次調用指令時,它都是'$ scope.block1'中的一個不同的塊(第一次是塊[0],然後是塊[1]等)。 – domakas

+0

沒問題。但是這個$ scope.block從來沒有設置...因爲我們有block:'='(我真的不知道這是什麼意思),然後block =「childBlock」,我認爲它是每個塊中的塊數組但是第一次調用函數$ scope.childs是undefined,因此我不能調用$ scope.block.childs – Cratein