2015-11-21 19 views
6

Vì vậy, tôi có một bộ sưu tập các đối tượng trong máy chủ, tôi muốn cư một ng-lặp lại khi tải trang.

Tôi đã làm một nhà máy mà lấy danh sách từ một nguồn tài nguyên trên máy chủ, như vậy:

app.factory('objectArray', ['$http', function($http) { 
     // This is returning a $$state object 
     // instead of response.data... 
     return $http.post('/get_collection').then(function(response) { 
      console.log(response.data); 
      return response.data; 
     }); 
    }]); 

Tôi đã có công việc mã này trước khi sử dụng ui-router và tài sản quyết tâm trong tuyên bố nhà nước. Tuy nhiên khi tiêm nhà máy này trực tiếp vào bộ điều khiển của tôi, thay vì nhận được response.data tôi nhận được một đối tượng nhà nước $$.

điều khiển của tôi trông như thế này:

app.controller('applicationController', ['$scope', 'objectArray', function($scope, objectArray) { 
    $scope.array = objectArray; 
    console.log($scope.array); 
}]); 
+0

trùng lặp có thể xảy ra của [Làm thế nào để trả lại phản hồi từ một cuộc gọi không đồng bộ ?] (http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call); (xem [this duplicate] (http://stackoverflow.com/questions/22951208/return-value-after-a-promise) là tốt) – Kenney

+0

@Kenney Tôi tò mò nhất về lý do tại sao nó hoạt động ở góc ui-router mà không cần bất kỳ mã bổ sung, nhưng trong trường hợp này, có {$$ state: object} –

+0

Tôi không chắc chắn, nhưng bạn không thể trả về các giá trị từ ['Promise.then'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Tham chiếu/Global_Objects/Promise/then). Phương pháp tiếp cận của bạn có giống như [this] (https://github.com/angular-ui/ui-router/issues/77) không? – Kenney

Trả lời

8

gì $ lợi nhuận dịch vụ http (và do đó các dịch vụ objectArray là) được gọi là một lời hứa. Bạn có thể truy cập vào dữ liệu thực tế bằng cách đăng ký một hàm callback sẽ được gọi khi dữ liệu có sẵn, tức là khi đối phó với các yêu cầu http trở lại từ máy chủ:

objectArray.then(function(data) { 
    $scope.array = data; 
}); 

Lý do bạn trực tiếp có quyền truy cập với dữ liệu khi sử dụng giải quyết là bộ định tuyến, khi hàm phân giải trả về một lời hứa, chờ lời hứa được giải quyết. Và chỉ sau đó, nó trích xuất dữ liệu từ lời hứa và đưa dữ liệu vào bộ điều khiển.

Để hiểu rõ hơn lời hứa, bạn có thể đọc the following article (và số sequel).

3

Như @JB Nizet nhận thấy, bạn mã là tốt, chỉ cần giải quyết nó trong bộ điều khiển Dưới đây là bản demo làm việc

angular.module('app', []); 
 
angular.module('app').factory('objectArray', ['$http', function($http) { 
 
    // This is returning a $$state object 
 
    // instead of response.data... 
 
    ////// changed request type and url for the sake of example 
 
    return $http.get('http://jsonplaceholder.typicode.com/posts/1') 
 
.then(function(response) { 
 
    console.log(response.data); 
 
    return response.data; 
 
}); 
 
}]); 
 
angular.module('app').controller('applicationController', ['$scope', 'objectArray', function($scope, objectArray) { 
 
    //////resolve it here 
 
    objectArray.then(function(successResponse){ 
 
    $scope.array = successResponse; 
 
    console.log($scope.array); 
 
    }); 
 
}]); 
 
angular.bootstrap(document.body, ['app']);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-controller="applicationController"> 
 
    <h5>Hello {{array.title}}</h5> 
 
</div>

+1

Trả lại lời hứa về dữ liệu (thông qua chuỗi lời hứa) thay vì lời hứa về phản hồi HTTP thực sự là một điều tốt. Nhà máy của OP hoàn toàn ổn. –

+0

Và ví dụ thứ hai của bạn là một ý tưởng tồi: bây giờ người gọi không có cách nào để biết liệu/khi yêu cầu http không thành công. Bạn cũng nên đọc http://blog.ninja-squad.com/2015/05/28/angularjs-promises/ –

+0

@JBNizet tôi thực sự biết rằng trong 2 ví dụ, phải có 2 cuộc gọi lại, cũng được cập nhật câu trả lời, bạn đã đúng thực sự –

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