$resource 作为全局服务

$resource as global Service

标题描述性不够,但我没有找到更好的标题。

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

服务:

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() 回调,看起来真的很脏,我不能从回调中获取 return 值。 那么有没有更简单的方法来解决这个问题呢? 我能否以某种方式确保在应用程序运行之前加载设置?

您绝对可以等到某些资源加载完毕后再显示特定内容。最简单的方法可能是使用 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