2013-09-05 21 views
9

Tôi có một chỉ thị "ng-init" trong HTML của tôi khởi tạo giá trị "data.id" trong mô hình dữ liệu Angular.js của tôi. Bây giờ hãy nói rằng tôi không thể thay đổi cách hoạt động của nó.Cách thích hợp để đợi các giá trị ng-init được thiết lập là gì?

Bây giờ, tôi muốn thực hiện yêu cầu HTTP ngay khi trang của tôi tải, nơi URL sẽ phụ thuộc vào giá trị data.id này. Cho đến nay, các công việc sau dường như hoạt động:

app.controller('MainCtrl', function ($scope, $http, $timeout) { 
    "use strict"; 

    $scope.data = {}; 

    $timeout(function() { 
    $http.get("/api/Something?id=" + $scope.data.id); 
    }, 0); 
}); 

Tuy nhiên, việc sử dụng hẹn giờ với thời gian chờ bằng 0 có vẻ khó khăn. (Và nếu tôi bỏ qua mã $ timeout và chỉ cần gọi trực tiếp $ http.get, thì $ scope.data.id là, tất nhiên, không xác định).

Có cách nào tốt hơn để chờ cho đến khi lệnh ng-init được thực thi trước khi đưa ra yêu cầu $ http không? Và mã thời gian chờ ở trên có được đảm bảo hoạt động trong mọi trường hợp/trên tất cả các trình duyệt không?

+0

tôi sẽ đề nghị mô hình hoặc điều khiển bạn đang tìm kiếm sau khi dữ liệu và quan điểm chỉ phản ánh dữ liệu, không cài đặt nó. đó là cách tiếp cận "góc cạnh" nhiều hơn nữa imho – Anton

Trả lời

5

Bạn có thể cố gắng sử dụng một chiếc đồng hồ

$scope.$watch('data.id',function(newValue,oldValue) { 
    if(newValue) { 
    $http.get("/api/Something?id=" + $scope.data.id); 
    } 
}); 
+0

Cảm ơn! Điều này dường như làm việc và tôi đã chấp nhận câu trả lời. Tôi tò mò mặc dù có một câu trả lời cho phần 2 của câu hỏi của tôi (nếu tôi giữ mã $ timeout, nó được đảm bảo để làm việc hoặc nó chỉ xảy ra để làm việc?) –

+0

Hãy xem cuộc thảo luận này trên SO. http://stackoverflow.com/questions/779379/why-is-settimeoutfn-0-sometimes-useful#comment14183689_779785. Hy vọng nó sẽ giúp bạn :) Nó có thể không hoạt động nếu có một sự chậm trễ đáng kể. – Chandermani

+0

nhưng điều này sẽ cháy mỗi lần thay đổi data.id, không chỉ trên init nắm tay, phải không? – Serge