该函数SetterForCatanCtrl
仅运行一次,当 angularngController
在引导您的应用程序时遇到指令时。发生这种情况时,您要从 DOM 访问的元素还不存在。
从控制器进行DOM操作不是一个好习惯,指令可以解决您所面临的问题。你的用例可以通过 CSS 和切换类来解决,但我想你想做的不仅仅是设置背景图像。
来自控制器的 DOM 操作
您不要求自定义指令,因此可以使用 ngClick 指令完成快速解决方案并调用可以切换图像的方法
示例 HTML
<div ng-controller='ctrl'>
<div class='row' ng-repeat='row in _.range(0,12)'>
<div id='{{row}}' ng-click="click($index)">
<button>{{row}}</button>
</div>
</div>
</div>
和 JS
var App = angular.module('app', []);
App.run(function($rootScope) {
$rootScope._ = _;
});
App.controller('ctrl', function($scope){
$scope.click = function(idx){
var elem = document.getElementById(idx);
console.log('clicked row', idx, elem);
};
});
因此,当单击按钮时,您将获得一个 id 并使用它从 DOM 中获取一个元素。但让我再说一遍,对于这个用例,指令是更好的选择。
JSFiddle:http: //jsfiddle.net/jaimem/3Cm2Y/
pd:如果您加载 jQuery,您可以使用angular.element(<selector>)
它从 DOM 中选择元素。
编辑:添加指令示例
来自指令的 DOM 操作
使用指令更简单,因为您只需将事件绑定到应用指令的元素
HTML
<h1>Directive</h1>
<div class='row' ng-repeat='row in _.range(0,12)'>
<div id='{{row}}' my-directive>
<button>{{row}}</button>
</div>
</div>
JS
App.directive('myDirective', function(){
return function(scope, element, attr){
element.bind('click', function(){
console.log('clicked element: ', element, element.html());
});
};
});
http://jsfiddle.net/jaimem/3Cm2Y/1/