2014-04-05 12 views
20

Ho questa funzione all'interno del mio controller AngularJS. Sembra questo;

polling_interval=1000; 
var poll = function() 
{ 
    //Execution code 
    $timeout(poll, polling_interval); 
}; 
poll(); 

utilizza il servizio $timeout in AngularJS per mantenere che si fa chiamare. Funziona finché non ho voluto aggiungere parametri a questa funzione di sondaggio. Il mio codice ha questo aspetto per i parametri aggiunti;

polling_interval=1000; 
var poll = function(param1, param2) 
{ 
    //Execution code 
    $timeout(poll(param1, param2), polling_interval); 
}; 
poll(param1, param2); 

La sintassi non era accettabile e io sono in perdita ora. Come si esegue la funzione con i parametri usando $timeout in AngularJS? Se questo non può essere fatto, ci sono soluzioni per risolvere questo problema? Mi piacerebbe che la mia funzione di polling accetti i parametri.

+0

Da 1.4.0 è possibile utilizzare '' '$ timeout ([fn], [delay], [invokeApply], [Pass]); '' ' . Documentazione [qui] (https://code.angularjs.org/1.4.0/docs/api/ng/service/$timeout) – vanduc1102

risposta

30

Perché il primo tipo di parametro del $timeout è la funzione, è necessario fare in questo modo:

polling_interval=1000; 
var poll = function(param1, param2) 
{ 
    //Execution code 
    $timeout(function() {poll(param1, param2)}, polling_interval); 
}; 
poll(param1, param2); 
+0

questo mi ha aiutato. Si noti tuttavia che funziona anche nel modo seguente purché non si abbiano parametri di funzione: 'myFunc = $ timeout (someFunc(), someMilliseconds);' Non appena someFunc() ha un parametro, non funziona più e si deve fare ciò che si è suggerito: 'myFunc = $ timeout (function() {someFunc (param)}, someMilliseconds);' – IHeartAndroid

+1

perché hai scelto una funzione anonima su bind()? – alejandrociatti

9

L'utilizzo di una funzione anonima sarebbe probabilmente il modo più semplice.

polling_interval=1000; 
var poll = function(param1, param2) 
{ 
    //Execution code 
    $timeout(function() { poll(param1, param2) }, polling_interval); 
}; 
poll(param1, param2); 
+0

perché hai scelto una funzione anonima su bind()? – alejandrociatti

40

$ timeout è involucro di angolare per window.setTimeout. Naturalmente, proprio come setTimeout, supporta il passaggio di parametri aggiuntivi alla fn scaduta.

Da API AngularJS:

$timeout([fn], [delay], [invokeApply], [Pass]); 

[fn] (funzione) essendo la funzione
[ritardo] (numero) il ritardo in ms
[invokeApply] (booleano) il valore predefinito è true, true, il fn viene eseguito all'interno di $ apply, se false, salta il controllo dirty del modello.
[Passa] parametri aggiuntivi! Questo è quello che vuoi!

Come il codice dovrebbe assomigliare:

polling_interval = 1000; 
var poll = function(param1, param2){ 
    //Execution code 
    $timeout(poll, polling_interval, true, param1, param2); 
}; 
poll(param1, param2); 

Questo è il modo corretto per passare parametri a un fn scaduta a. Spero che tu lo trovi utile

EDIT: Questa funzione è stato aggiunto il 22 gennaio, 2015 (v1.4.1), prima di tale versione, l'approccio corretto sarebbe stato:

polling_interval = 1000; 
var poll = function(param1, param2){ 
    //Execution code 
    $timeout(poll.bind(null, param1, param2), polling_interval); 
}; 
poll(param1, param2); 
+1

La migliore soluzione! Mi chiedevo come farlo prima della 1.4.1, quindi di nuovo +1. Altre soluzioni che utilizzano funzioni anonime possono dare comportamenti imprevisti a causa delle chiusure. – Masadow

+1

Usando l'approccio '.bind()' sai perché il primo argomento deve essere 'null'?mi ha costretto un po 'per un po' quando non l'ho fatto e i parametri si sono incasinati. –

+3

@Will il primo argomento per '.bind()' è il 'this', il" contesto ", a cui la funzione sarà associata. Questo è in effetti l'uso principale di' .bind() '. Quando si usano i parametri aggiuntivi, non si associa solo il contesto, ma si associano tanti parametri quanti si passano a '.bind()', quindi quando si chiama il risultato associato fn, si sta chiamando con il 'this' impostato con il primo parametro e i parametri impostati con i parametri rimanenti. Chek [Function.prototype.bind()] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind). O forse qualcun altro può chiarire in modo più preciso – alejandrociatti

Problemi correlati