我正在尝试编写一个包含模板的指令。模板正在渲染我想要检索的一些DOM元素。但是,当我尝试在链接函数中检索我的DOM元素时,找不到DOM元素。如果我在选择找到它们的元素之前添加一个window.setTimeout方法。在尝试操作链接函数中的DOM之前,如何等待模板完成渲染?
这是我正在尝试做的指令代码:
module.directive('testLocationPicker', function() {
var linkFn = function(scope, element, attrs) {
console.log('in linking function');
window.setTimeout(function() {
var positions = $('.position');
console.log('number positions found: ' + positions.length);
positions.click(function(e) {
console.log('position clicked');
scope.$apply(function() {
scope.selectedPosition = $(e.currentTarget).html();
});
});
}, 500);
};
return {
link: linkFn,
restrict: 'E',
template: 'Choose a position: <div class="position" ng-repeat="position in positions">{{position}}</div>',
}
});
我有一个JS小提琴我想要做的事情:http://jsfiddle.net/bdicasa/XSFpu/42/
答案 0 :(得分:1)
我建议做这样的事情:
var module = angular.module('test', []);
module.controller('TestController', function($scope) {
$scope.positions = [
'Test Position 1',
'Test Position 2',
'Test Position 3'
];
$scope.selectedPosition = '';
$scope.handleClick = function (index) {
$scope.selectedPosition = $scope.positions[index];
}
});
module.directive('testLocationPicker', function() {
return {
restrict: 'E',
template: 'Choose a position: <div class="position" ng-repeat="position in positions" ng-click="handleClick($index)">{{position}}</div>',
}
});
答案 1 :(得分:1)
不要试图搜索dom并添加点击事件,只需像这样修改模板:
template: 'Choose a position: <div class="position" ng-repeat="position in positions" data-ng-click="positionClick($index)">{{position}}</div>',
然后在链接函数中创建一个positionClick函数:
var linkFn = function(scope, element, attrs) {
scope.positionClick = function(index){
scope.selectedPosition = index;
}
};
工作jsFiddle:http://jsfiddle.net/XSFpu/77/
您的方法无效的原因是因为在加载模板后ng-repeat没有触发。所以它加载了指令,链接函数已被命中,但ng-repeat实际上还没有开始重复。这就是为什么我建议你移动一些代码以适应它。