AngularJS, service & promises

AngularJS, service & promises

本文关键字:promises amp service AngularJS      更新时间:2023-09-26

我在angularJS工作了一段时间,我需要一些帮助…

我想这样做:

  • 我需要建立一个服务,将获得&存储我的应用程序属性(通过$http.get())
  • 我想有几个弹出使用这些属性(1弹出= 1指令/控制器..)
  • 我不想让弹出窗口"看到"其余的调用(myService)。myData应该足够了)
我问题:

  • 在控制器调用
  • 之前,我无法使服务检索数据
  • 我看到了一些方法…但它需要一些应用程序的变化(在app.js),我不希望弹出开发人员这样做
  • 因为我不能这样做,所以我不能在我的服务/控制器中做一些干净的东西

我希望客户端能够制作自己的弹出窗口,而不关心服务如何调用应用程序。我知道我可以在控制器中使用常规回调。但由于它是客户端角色的代码里面,我希望这部分是尽可能简单。

PS:当然我之前测试了一个更简单的实现,在控制器内部的回调等。它工作. .但我需要像下面一样干净:

代码示例:服务:

angular.module("myService", []).service("MyService", ['$http', function($http){
    this.propertiesInitialized = false;
        this.availableLanguages = [];
        this.availableResultTypes = [];
        this.availableStates = [];
        this.availableCrawlTypes = [];
        this.dateFormat = "";
        this.getProperties = function(callback)
        {
            $http.get("app/application-properties.json").success(function(JSONProperties) {
                this.availableLanguages = JSONProperties.configurations.crawlerLanguages;
                this.availableResultTypes = JSONProperties.configurations.resultTypes;
                this.availableStates = JSONProperties.configurations.states;
                this.availableCrawlTypes = JSONProperties.configurations.crawlTypes;
                this.dateFormat = JSONProperties.configurations.dateFormat;
                this.propertiesInitialized = true;
            });
        }
    }]);

一个弹出:

angular.module("popup1", ["MyService"])
.controller('Controller1', ['$scope', 'MyService', 
    function($scope, MyService) {
    $scope.languages = MyService.availableLanguages;
    $scope.crawlTypes = MyService.availableLanguagesCrawlTypes;
    $scope.resultTypes = MyService.availableLanguagesResultTypes;
}]);

你有什么想法吗?

使用承诺

angular.module("myService", []).service("MyService", ['$http', '$q', function($http, $q){
    var deffered = $q.defer();
    var theService = this;
    theService.propertiesInitialized = deffered.promise;
    theService.availableLanguages = [];
    theService.availableResultTypes = [];
    theService.availableStates = [];
    theService.availableCrawlTypes = [];
    theService.dateFormat = "";
    $http.get("app/application-properties.json").success(function(JSONProperties) {
        theService.availableLanguages = JSONProperties.configurations.crawlerLanguages;
        theService.availableResultTypes = JSONProperties.configurations.resultTypes;
        theService.availableStates = JSONProperties.configurations.states;
        theService.availableCrawlTypes = JSONProperties.configurations.crawlTypes;
        theService.dateFormat = JSONProperties.configurations.dateFormat;
        theService.propertiesInitialized.resolve();
    });
}]);
angular.module("popup1")
.controller('Controller1', ['$scope', 'MyService', 
    function($scope, MyService) {
    MyService.propertiesInitialized.then(function(){
        $scope.languages = MyService.availableLanguages;
        $scope.crawlTypes = MyService.availableLanguagesCrawlTypes;
        $scope.resultTypes = MyService.availableLanguagesResultTypes;
    });
}]);