2012-12-05 13 views
8

Ich möchte wie etwas tun:Wie wiederhole ich Element-ID in AngularJS?

<div class='row' ng-repeat='row in _.range(0,12)'> 
    <div id='{{row}}'></div> 
</div> 

aber wenn in der Steuerung Ich versuche:

function SetterForCatanCtrl($scope) { 
    $scope._ = _; 
    try { 
     var tile = document.getElementById('5'); 
     tile.style.backgroundImage = "url('aoeu.png')"; 
    } catch (e) { 
     alert(e) 
    } 
} 

getElementById gibt null zurück, so wie kann ein ids Element eingestellt werden AngularJS Variablen?

+0

Sie können einen benutzerdefinierten Filter verwenden, wie es in http://stackoverflow.com/questions/11873570/angularjs-for-loop-with-numbers-ranges –

+0

@ Olivier.Roger erfolgt , der Bereich funktioniert gut. Es kam von http://stackoverflow.com/questions/13685138/how-to-repeat-elements-in-angularjs. Meine Frage betrifft das Festlegen der ID des Elements. Das scheint nicht zu funktionieren. –

Antwort

13

Die Funktion SetterForCatanCtrl wird nur einmal ausgeführt, wenn angular eine ngController Anweisung trifft, während sie Ihre App bootstrappt. In diesem Fall existiert das Element, auf das Sie vom DOM zugreifen möchten, noch nicht.

Doing DOM Manipulation von einem Controller ist keine gute Praxis, Direktiven können die Art von Problem lösen, die Sie konfrontiert sind. Ihr Anwendungsfall kann mit CSS gelöst werden und nur Klassen wechseln, aber ich denke, Sie möchten mehr als nur ein Hintergrundbild setzen.

DOM-Manipulation von einem Controller

Sie nicht für benutzerdefinierte Richtlinien fordern, so dass eine schnelle Lösung könnte die ngClick Richtlinie erfolgt mit und eine Methode aufrufen, die

Bilder

Beispiel 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> 
wechseln

Und 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); 
    }; 
​}); ​ 

Also, wenn Wenn Sie auf eine Schaltfläche klicken, erhalten Sie eine ID und verwenden diese, um ein Element aus dem DOM zu erhalten. Aber lassen Sie mich wiederholen, eine Richtlinie für diesen Anwendungsfall ist eine bessere Wahl.

JSFiddle: http://jsfiddle.net/jaimem/3Cm2Y/

pd: wenn Sie jQuery laden Sie angular.element(<selector>) verwenden können Elemente aus dem DOM zu wählen.


bearbeiten: Hinzufügen Direktive Beispiel

DOM-Manipulation aus einer Richtlinie

eine Richtlinie zu verwenden ist einfacher, da Sie nur ein Ereignis an das Element binden kann, die Richtlinie auf

angewendet wird

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/

+0

Ich ging mit dem, was Sie in der Jfiddle haben. Vielen Dank. –

+0

@jaime danke! Ihre Antwort hilft mir sehr! Übrigens, wo könnte ich das Dokument "Umfang, Element, Attr" in Direktive finden? Und warum sind sie ohne '$'?was ist das anders? Ich bin ein Neuling von AngularJS. – zx1986

+2

@ zx1986 http://devdocs.io/angular/ng.compileprovider#methods_directive – Martin

Verwandte Themen