2014-04-05 18 views
20

Tôi có chức năng này bên trong bộ điều khiển AngularJS của tôi. Nó trông như thế này;

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

Sử dụng dịch vụ $timeout trong AngularJS để tiếp tục tự gọi. Điều này làm việc cho đến khi tôi muốn thêm các tham số cho hàm thăm dò ý kiến ​​này. Mã của tôi trông như thế này cho các tham số được thêm vào;

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

Cú pháp không được chấp nhận và hiện tại tôi đang thua lỗ. Làm thế nào để thực thi hàm với các tham số bằng cách sử dụng $timeout trong AngularJS? Nếu điều này không thể được thực hiện, có xung quanh vấn đề này không? Tôi muốn có chức năng thăm dò ý kiến ​​của tôi chấp nhận các thông số.

+0

Từ 1.4.0 bạn có thể sử dụng '' '$ timeout ([fn], [delay], [invokeApply], [Pass]); '' ' . Tài liệu [ở đây] (https://code.angularjs.org/1.4.0/docs/api/ng/service/$timeout) – vanduc1102

Trả lời

30

Bởi vì các loại tham số đầu tiên của $timeout là chức năng, bạn cần phải làm như thế này:

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

điều này đã giúp tôi. Tuy nhiên, lưu ý rằng nó cũng hoạt động trong các điều sau, miễn là bạn không có bất kỳ tham số hàm nào: 'myFunc = $ timeout (someFunc(), someMilliseconds);' Ngay khi someFunc() có một tham số, nó không hoạt động nữa và người ta phải làm những gì bạn đã gợi ý: 'myFunc = $ timeout (function() {someFunc (param)}, someMilliseconds);' – IHeartAndroid

+1

tại sao bạn chọn một hàm ẩn danh trên bind()? – alejandrociatti

9

Sử dụng chức năng ẩn danh có thể là cách dễ nhất.

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

tại sao bạn chọn một hàm ẩn danh trên bind()? – alejandrociatti

40

$ timeout là wrapper góc cho window.setTimeout. Đương nhiên, giống như setTimeout nó hỗ trợ truyền các tham số bổ sung cho fn đã hết thời gian chờ.

Từ API AngularJS:

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

[fn] (chức năng) là chức năng của bạn
[chậm trễ] (số) sự chậm trễ trong ms
[invokeApply] (boolean) mặc định là true, đúng, fn được chạy bên trong $ apply, nếu false, nó bỏ qua kiểm tra mô hình bẩn.
[Pass] thông số bổ sung! Đây là cái bạn muốn!

Làm thế nào mã của bạn sẽ giống như thế:

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

Đây là cách thích hợp để truyền tham số cho một fn timed-out. Tôi hy vọng bạn thấy nó hữu dụng.

EDIT: Tính năng này đã được bổ sung vào ngày 22 tháng 1 năm 2015 (v1.4.1), trước khi phiên bản đó, cách tiếp cận đúng sẽ là:

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

Giải pháp tốt nhất! Tôi đã tự hỏi làm thế nào để làm điều đó trước khi 1.4.1 để +1 một lần nữa. Các giải pháp khác bằng cách sử dụng các chức năng ẩn danh có thể tạo ra các hành vi không mong muốn do bị đóng. – Masadow

+1

Sử dụng phương thức '.bind()' để bạn biết tại sao đối số đầu tiên phải là 'null'?nó đã khiến tôi bối rối một chút khi tôi không làm điều này và các thông số đã bị rối tung lên. –

+3

@Vào đối số đầu tiên cho '.bind()' là 'this'," context ", rằng hàm sẽ bị ràng buộc. Đó là thực tế, cách sử dụng chính của' .bind() '. Khi sử dụng các tham số bổ sung, bạn không chỉ ràng buộc ngữ cảnh, mà còn ràng buộc nhiều tham số khi bạn chuyển tới '.bind()', vì vậy khi bạn gọi fn kết quả, bạn đang gọi nó bằng 'this' mà bạn đặt tham số đầu tiên và các thông số bạn đã đặt với các tham số còn lại. Chek [Function.prototype.bind()] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind). Hoặc có thể ai đó khác có thể làm rõ chính xác hơn – alejandrociatti

Các vấn đề liên quan