$ resource as global Service

时间:2015-11-03 11:23:50

标签: angularjs service promise ngresource

标题并不像它需要的那样具有描述性,但我找不到更好的标题。

所以在我的AngularJS应用程序中,我有一个设置服务。 在此服务中,我维护一个由$ resource查询的对象。 我正在使用这种方法,因为我不想一直查询我的设置,因为应用程序的其他部分需要直接受到设置更改的影响。

服务:

module.factory("Settings", [$resource, function($resource){
  var resource = $resource("path/to/api/settings");
  var settings = resource.get();

  return {
    getSettings: function(){
      return settings;
    }
  };
}]);

用法:

module.controller("MyController", ["Settings", function(Settings){
  var self = this;
  self.settings = Settings.getSettings();
  self.result = 0;

  self.aMethod = function(arg){
    //Do some calculate based on settings
    self.settings.then(function(){
      self.result = arg * self.settings.multiplyBy;
    });
  };

  self.setMultiplyBy = function(arg){
     //This will affect all usages where multiplyBy is used
     self.settings.multiplyBy = arg;
     self.settings.$save();
  };

})];

问题是我每次要使用它时都要检查设置是否已解决。 所以我在我的控制器上有.then()个回调,看起来很脏,我不能从回调中返回值。 那么有更简单的方法来解决这个问题吗? 我可以以某种方式确保在应用程序运行之前加载设置吗?

1 个答案:

答案 0 :(得分:1)

在显示特定内容之前,您肯定可以等到加载某些资源。最简单的方法可能是使用ui-routerresolve州属性。

$stateProvider.state('myState', {
    templateUrl: 'mytemplate.html',
    controller: 'MyContoller',
    resolve: {
        settings: function(Settings){
            // return a promise here
            return Settings.getSettings();
        }
    }
});

然后在您的控制器中,您可以注入settings,这将是您的设置对象的已解决(承诺履行版本)。

详细了解ui-router&在这里解决:https://github.com/angular-ui/ui-router/wiki#resolve