【问题标题】:$resource as global Service$resource 作为全局服务
【发布时间】:2016-02-03 12:48:18
【问题描述】:

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

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

【问题讨论】:

    标签: angularjs service promise ngresource


    【解决方案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

    【讨论】:

    • 删除了不必要的评论。感谢您的回复。
    • 你可能不得不摆弄你的服务,但是如果使用 resolve 函数返回任何类型的承诺,它会等到承诺被解决后再加载视图。因此,您需要设置一个仅在您需要的数据可供使用时才会解析的 Promise。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多