2017-06-07 27 views
0

我試圖獲得在ng-repeat中創建的<div>,以便我可以在由第三方庫生成的內容中添加內容。獲取JavaScript引用在ng-repeat中創建的元素

嘗試1:

<div ng-init="init()"> 
    <div ng-repeat="item in items"> 
    <div id="{{ item.id }}"></div> 
    </div> 
</div> 

$scope.init = function() { 
    for (var i in items) { 
    var element = document.getElementById(items[i].id); 
    generateInnerHtml(element); 
    } 
}; 

嘗試2:

<div ng-init="init()"> 
    <div ng-repeat="item in items"> 
    <div id="{{ item.id }}" ng-init="addContent(item.id)"></div> 
    </div> 
</div> 

$scope.addContent = function(id) { 
    var element = document.getElementById(id); 
    generateInnerHtml(element); 
}; 

嘗試3:

<div ng-init="init()"> 
    <div ng-repeat="item in items"> 
    <div id="{{ item.id }}" ng-init="addContent(this)"></div> 
    </div> 
</div> 

$scope.addContent = function(element) { 
    generateInnerHtml(element); 
}; 

對於所有三次嘗試,element始終爲空或未定義。怎麼了?

+0

保持在控制器到DOM元素的引用可能會落入角度反模式的保護下。爲什麼不對ng-repeat中的元素進行指示,並且在指令'link'函數中執行所需的DOM級別操作/引用? –

回答

1

在嘗試#1和#2中,您的函數在處理完所有Angular指令之前運行,因此divid尚未定義。

你可以用你的代碼$timeout()迫使它要等到DOM正確生成:

angular.module("myApp", []) 
    .controller("myController", function($scope, $timeout) { 
    $scope.addContent = function(id) { 
     $timeout(function() { 
     var element = document.getElementById(id); 
     generateInnerHtml(element); 
     }, 0); 
    }; 

}) 

演示,請參閱:https://jsfiddle.net/1w5ntajm/

+0

即使延遲爲0,它爲什麼還能工作? – thegreatjedi

+0

@thegreatjedi此視頻將闡明:https://www.youtube.com/watch?v=8aGhZQkoFbQ –

0

正如已經指出的那樣,您的函數在渲染完成之前運行。但是,如同@anied所提到的那樣,讓DOM操作符合指令。這樣,您可以將其與控制器分離,並且可以輕鬆地重新使用它。

plunker參見

標記:

<div ng-repeat="item in items" data-generated="item"></div> 

指令:

app.directive('generated', ['$compile', function($compile) { 
    var generateInnerHtml = function(e) { 
    e.innerHTML = '<pre>item = {{vm.item}}</pre>' 
    }; 
    return { 
    restrict: 'AE', 
    scope: { 
     item: '=generated' 
    }, 
    controllerAs: 'vm', 
    bindToController: true, 
    controller: [function() { 
    }], 
    compile: function(element, attr) { 
     generateInnerHtml(element[0]); 
     return function(scope, element, attr) { 
     // Only do this if you need access to scope variables 
     $compile(element.contents())(scope); 
     } 
    } 
    }; 
}]); 
相關問題