2015-11-03 88 views
0

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

因此,在我的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

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

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

然后你的控制器里面,你可以注入settings这将是解决(承诺履行版)的设置对象。

了解更多关于UI路由器&决心在这里:https://github.com/angular-ui/ui-router/wiki#resolve

+0

删除unnecesarry评论。感谢您的回复。 – Genmais

+0

您可能不得不摆弄您的服务,但如果使用解析函数返回任何种类的承诺,它将在加载视图之前等待承诺解决。所以你需要设置一个承诺,只有当你需要的数据可以使用时才会解决。 –