2014-04-05 29 views
20

Bu işlevi AngularJS denetleyicimin içinde var. Buna benziyor;

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

Kendisini çağıran tutmak angularjs içinde $timeout hizmetini kullanır. Bu, bu anket işlevine parametre eklemek istedikçe çalışır. Eklenen parametreler için kodum buna benziyor;

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

Sözdizimi kabul edilemezdi ve şu anda bir kayıp yaşıyorum. Fonksiyonu AngularJS'de $timeout kullanarak parametrelerle nasıl uygularım? Bu yapılamazsa, bu soruna yönelik işler var mı? Anket işlevimin parametreleri kabul etmesini istiyorum.

+0

kullanabileceğiniz '' '$ zaman aşımı ([fn], [delay], [invokeApply], [Pass]); '' . Belgeler [burada] (https://code.angularjs.org/1.4.0/docs/api/ng/service/$timeout) – vanduc1102

cevap

30

, böyle yapmanız gerekir:

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

bu bana yardımcı oldu. Bununla birlikte, herhangi bir işlev parametreniz olmadığı sürece aşağıdaki durumlarda da çalıştığını unutmayın: 'myFunc = $ timeout (someFunc(), someMilliseconds);' SomeFunc() parametresine sahip olduğu anda, artık çalışmaz ve sizin önerilerinizi yapmak zorundadır: 'myFunc = $ timeout (function() {someFunc (param)}, someMilliseconds);' – IHeartAndroid

+1

neden bind() üzerinde anonim bir işlev seçtiniz? – alejandrociatti

9

Anonim bir işlev kullanmak muhtemelen en kolay yol olacaktır. $timeout ilk parametresi tür fonksiyon olduğu için

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

Neden bind() üzerinde anonim bir işlev seçtiniz? – alejandrociatti

40

$ zaman aşımı window.setTimeout için açısal en sarıcı. Doğal olarak, setTimeout gibi, zaman aşımına uğramış fn'ye ek parametreler geçirmeyi de destekler. Angularjs API kaynaktan

:

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

[fn] (fonksiyon) olarak da işlev
[gecikme] (sayı) ms gecikme
[invokeApply] (boolean) varsayılan olarak true, true, fn $ uygulamasının içinde çalışır, eğer false ise, model kirli kontrolleri atlar.
[Pass] ek parametreler! Senin istediğin bu!

gibi kod görünmelidir nasıl

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

Bu süreli bir çıkış fn parametreleri geçirmek için uygun bir yoldur. Umarım bunu faydalı bulursun.

DÜZENLEME: Bu özellik bu sürüme önce, doğru bir yaklaşım olurdu, 22 Ocak 2015 (v1.4.1) üzerine eklendi: 1.4.0 itibaren

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

En iyi çözüm! 1.4.1'den önce nasıl yapılacağını merak ettim. Anonim işlevler kullanan diğer çözümler, kapanma nedeniyle beklenmedik davranışlar verebilir. – Masadow

+1

'.bind()' yaklaşımını kullanarak, ilk argümanın null null olması gerektiğini biliyor musunuz?Bunu yapmadığım zaman beni biraz şaşırttı ve parametreler berbattı. –

+3

@Bu ilk argümanı burada .bind() '' '' '' '' '' '' '' '' '' '' '' '' işlevinin bağlı olacağı '' '' '' '' '' 'dır. Ek parametreleri kullanırken, yalnızca bağlamı değil, ama .bind() 'ye geçtiğiniz kadar çok sayıda paramı bağladığınızda, sonuçta elde edilen bağlı fn'yi çağırdığınızda, onu“ bu ”ile çağırıyorsunuz demektir. İlk param ve kalan paramlarla belirlediğiniz paramlar. Chek [Function.prototype.bind()] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind). Veya belki başka biri daha doğru netleştirebilir – alejandrociatti

İlgili konular