2016-07-17 136 views
5

Attualmente sto lavorando su un codice per ottenere qualcosa come ng-repeat in angolare. Fondamentalmente un ciclo for in html. il codice prende ogni elemento con la classe "loop" e lo elabora con le informazioni fornite tramite l'attributo "info". Ecco il codice: HTMLraggiungere la funzione di ng-repeat angolare in javascript

<div class="loop" data-info="i in 1 to 10"> 
-i- 
</div> 

Javascript

$(".loop").each(function(i){ 
var loop_info=$(this).attr("data-info"); 
var fin=loop_info.match(/(.*) in (\d+) to (\d+)/); 
var variable=fin[1], 
initial=fin[2], 
final=fin[3]; 
var htm=$(this).html(),printed=""; 
for(j=initial;j<=final;j++){ 
    var temp=htm; 
    var r=new RegExp("-("+variable+")-","g") 
    temp=temp.replace(r,j); 
    printed+=temp; 
} 
$(this).html(printed); 
}); 

Ora ho incluso anche la funzione di sostituire il - variabili - con i numeri.

Tutto ha funzionato perfettamente, ma quando i loop sono annidati cioè

<div class="loop" data-info="i in 1 to 10"> 
<div class="loop" data-info="j in 1 to 10"> 
    -j- 
</div> 
</div> 

doesnt lavoro sul ciclo nidificato, cioè -J- non ottiene sostituiti con i numeri. Non so perché questo sta accadendo, ogni aiuto è apprezzato.

+0

'info' è un attributo non valido. Non seguire gli stessi * errori *, usa invece 'data-info'. –

+0

@Roko, grazie per aver segnalato l'errore, modificherò la domanda immediatamente – decatron

+0

Quindi, i cicli annidati, l'interno opera in tempi 'j' in uno' i'. Quindi, in pratica, dovresti prima controllare se qualche elemento 'data-info' ha altri bambini' data-info' e agire di conseguenza. '$ (this) .html (stampato);' distruggerà il contenuto del bambino alla prima iterazione dell'elemento '.each()'. Significa che il '.loop' interno viene distrutto/sostituito e non accessibile nella cache DOM a questo punto. –

risposta

6

La sostituzione non riesce perché l'HTML è stato modificato e il successivo riferimento .loop raccolto da jQuery per il ciclo for, non rappresenta più ciò che era prima.

Invece, rendere il ciclo for andare in direzione opposta:

$($(".loop").get().reverse()).each(function(i){ 
    // etc... 

Snippet:

$($(".loop").get().reverse()).each(function(i){ 
 
    var loop_info=$(this).attr("info"); 
 
    var fin=loop_info.match(/(.*) in (\d+) to (\d+)/); 
 
    var variable=fin[1], 
 
     initial=fin[2], 
 
     final=fin[3]; 
 
    var htm=$(this).html(),printed=""; 
 
    for(j=initial;j<=final;j++){ 
 
    var temp=htm; 
 
    var r=new RegExp("-("+variable+")-","g") 
 
    temp=temp.replace(r,j); 
 
    printed+=temp; 
 
    } 
 
    $(this).html(printed); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="loop" info="i in 1 to 10"> 
 
    <div class="loop" info="j in 1 to 10"> 
 
     -i-:-j- 
 
    </div> 
 
</div>

+0

Soluzione sorprendentemente semplice –

+0

Grazie per la risposta ha funzionato perfettamente :) – decatron

+0

Interessante ... Dovrò testarlo su qualcosa. thnx –

Problemi correlati