2013-03-20 29 views
5

Trong ứng dụng angularjs, tôi đang cố gắng sử dụng dịch vụ tùy chỉnh để giữ dữ liệu chính của ứng dụng, "các mục". Tuy nhiên, tôi muốn bootstrap dữ liệu vào dịch vụ khi tải trang ban đầu, để tránh một yêu cầu ajax riêng biệt đến máy chủ để có được nó. Điều gì sẽ là cách sạch nhất để thực hiện việc này?AngularJS - Bootstrapping dữ liệu thành một dịch vụ tải trang

Dưới đây là một đoạn dịch vụ của tôi để tham khảo:

app.factory('items', function() { 
    var itemsService = {}, 
     items = []; 

    itemsService.list = function() { 
     return items; 
    }; 

    itemsService.add = function() { 
     /* ... */ 
    }; 

    return itemsService; 
}); 

Và trên backend Tôi đang sử dụng Node.js + expressjs + ngọc, vì vậy tôi sẽ được tiêm dữ liệu vào trang sử dụng:

!{JSON.stringify(items)} 
+0

Có thể trùng lặp. Câu trả lời tốt hơn trong bản gốc - [Làm thế nào để khởi động dữ liệu vì nó được tìm nạp bởi một dịch vụ tài nguyên $ trong Angular.js] (http://stackoverflow.com/questions/12451864/how-to-bootstrap-data-as-it- it-was-fetched-by-a-resource-service-in-angular-js) – EBarr

Trả lời

3

Đặt dữ liệu được khởi động của bạn từ máy chủ vào biến JavaScript chung. Yêu cầu dịch vụ của bạn chỉ định items cho biến toàn cầu đó (hoặc sao chép dữ liệu vào items).

+0

đó là những gì tôi đã suy nghĩ, nhưng mà nên phân công/sao chép xảy ra trong mã của tôi? Bởi vì đơn giản là thực hiện nó trong lời gọi 'app.factory' để tạo dịch vụ, thay thế' items = [] 'bằng' items = window.bootstrappedData' (nơi bootstrappedData là biến javascript toàn cục) dường như không hoạt động. –

+0

Tôi sẽ đặt bài tập/bản sao vào nơi bạn đã thử. Điều duy nhất tôi có thể nghĩ để kiểm tra là đảm bảo mã JavaScript gán dữ liệu cho biến toàn cục 'bootstrappedData' đang thực thi trước Angular. –

+0

hóa ra chỉ là một lỗi nhỏ về phía tôi, thẻ kịch bản mà tôi đã đặt dữ liệu vào có thuộc tính type được đặt thành 'js/data' để nó không được thực hiện dưới dạng javascript. > _ < –

1

Làm thế nào về một cái gì đó như thế này:

app.run(['items', function (items) { 
    items.load(); 
}]) 

này giả định items của bạn ervice có hàm load (hoặc một cái gì đó giống như nó) mà Ajax thực tế làm việc bằng cách sử dụng tài nguyên $ http hoặc $.

+0

nhưng sau đó nếu tôi chỉ gọi hàm 'load()' của mình, tôi vẫn chỉ yêu cầu ajax đó để tải dữ liệu thay vì bằng cách sử dụng javascript nội tuyến tiêm mảng 'mục', hoặc tôi hoàn toàn hiểu lầm câu trả lời của bạn? –

+0

Tôi giả định rằng một hàm "tải" sẽ thực hiện một yêu cầu Ajax mà hàm thành công của nó sẽ gán tập dữ liệu mới vào biến "items" nội tuyến. Vì vậy, "tải" không trả lại bất cứ điều gì; mục đích duy nhất của nó là lấy dữ liệu vào mảng "mục" bên trong của bạn. – Jollymorphic

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