2014-05-21 18 views
8

Tôi mới vào AngularJS và có một dịch vụ mà nạp cấu hình sử dụng ban đầu của tôiAngularJS chạy chức năng dịch vụ trước khi các chức năng khác

angular.module('myApp').service('myService', ['$http', function ($http) { 
    var self = this; 
    self.user = {}; 

    self.loadConfiguration = function() { 
     $http.get('/UserConfig').then(function (result) { 
      self.user = result.data; 
     }); 
    }; 

    self.loadConfiguration(); 
}]); 

Tôi có một bộ điều khiển có sử dụng cấu hình từ dịch vụ này

angular.module('myApp').controller('myController', ['$scope', 'myService', function ($scope, myService) { 
    var self = this; 

    // calculation based on service value 
    self.something = myService.user.something * something else; 
}]); 

Vấn đề ở đây là myService.user.something có thể không được xác định vì yêu cầu AJAX có thể chưa hoàn thành khi mã này được gọi. Có cách nào để hoàn thành dịch vụ trước khi bất kỳ mã nào khác được chạy không? Tôi muốn chức năng dịch vụ 'loadConfiguration' được chạy chỉ một lần bất kể số lượng bộ điều khiển phụ thuộc vào nó.

Trả lời

5

Nếu bạn muốn đảm bảo rằng mã của bạn trong bộ điều khiển được thực hiện sau khi cuộc gọi AJAX của bạn trả về, bạn có thể sử dụng sự kiện.

Sử dụng này trong dịch vụ của bạn:

angular.module('myApp').service('myService', ['$http', '$rootScope', function ($http, $rootScope) { 
    var self = this; 
    self.user = {}; 

    self.loadConfiguration = function() { 
     $http.get('/UserConfig').then(function (result) { 
      self.user = result.data; 
      $rootScope.$broadcast('myService:getUserConfigSuccess'); 
     }); 
    }; 

    self.loadConfiguration(); 
}]); 

Trong điều khiển của bạn:

angular.module('myApp').controller('myController', ['$scope', 'myService', function ($scope, myService) { 
    var self = this; 

    $scope.$on('myService:getUserConfigSuccess', function() { 
     // calculation based on service value 
     self.something = myService.user.something * something else; 
    }) 
}]); 

Bạn thậm chí có thể đính kèm một đối tượng đến sự kiện này.

Vui lòng tham khảo https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope.

+1

Câu trả lời của bạn hầu hết đều hoạt động. Nó không hoạt động nếu dịch vụ đã được nạp trước khi bộ điều khiển được khởi tạo vì sau đó $ scope. $ On ('myService: getUserConfigSuccess') sẽ không bao giờ kích hoạt. –

+0

@ user1 Ahhhh, vâng! Vì vậy, nếu bạn muốn chắc chắn, bạn có thể gọi 'loadConfiguration()' từ bộ điều khiển của bạn, hoặc thêm một kiểm tra nếu 'user' đã được nạp trong bộ điều khiển (nếu có, hãy sử dụng nó; nếu không, thêm một trình lắng nghe sự kiện). –

+0

Vâng, đó là những gì tôi đã làm. :) Tôi muốn để lại một hồ sơ về sự thiếu sót của câu trả lời được chấp nhận để giúp đỡ bất cứ ai đọc vài tháng này kể từ bây giờ. –

5

Bạn có thể gọi phương thức dịch vụ của bạn bên .run() chức năng

Run Blocks

Run khối là những điều gần gũi nhất trong góc với phương pháp chính . Khối chạy là mã cần chạy để khởi động ứng dụng . Nó được thực hiện sau khi tất cả các dịch vụ đã được cấu hình và các vòi phun đã được tạo ra. Chạy các khối thường là chứa mã khó kiểm tra đơn vị và vì lý do này phải là được khai báo trong các mô-đun riêng biệt, để chúng có thể bị bỏ qua trong các thử nghiệm đơn vị .

https://docs.angularjs.org/guide/module

angular.module('myApp').run(function()){ 
    //use your service here 
} 

Một cách để đối phó với sự chậm trễ ajax, là sử dụng chức năng $rootScope.$broadcast() trên $ http.success mà sẽ phát sóng sự kiện tùy chỉnh của bạn cho tất cả các bộ điều khiển. Antoher cách là sử dụng lời hứa và thực hiện các hành động trong bộ điều khiển sau khi giải quyết. Dưới đây là một số ý tưởng: https://groups.google.com/forum/#!topic/angular/qagzXXhS_VI/discussion

+0

Lựa chọn tốt nhất! ^^ Cảm ơn vì sự giúp đỡ :) –

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