AngularJS中Factory单例内部$resource配置如何随environmentData动态更新
问题根因
AngularJS的factory是全局单例,你当前的写法在factory初始化时就会一次性执行environmentData.getAppInfoURI()、environmentData.getHistoryURI(),把返回的静态字符串写入$resource的配置中。后续environmentData对象更新时,已经写入配置的静态字符串不会自动更新,就会出现一直用旧值的问题。
方案1:使用$resource支持的动态url函数(推荐,改动最小)
AngularJS 1.3及以上版本中,$resource的action配置的url属性支持传入函数,函数会在每次调用接口时执行,自动获取最新的environmentData值,不需要修改任何控制器调用逻辑:
angular.module('mbapp.sm') .factory('coreService', coreService); coreService.$inject = ['$resource','environmentData']; function coreService($resource,environmentData) { return $resource(function() { return environmentData.getAppInfoURI() }, null, { getAppInfo: { method: 'GET', headers: { 'Accept': 'application/json' }, // 改为函数,每次调用接口时动态获取最新URI url: function() { return environmentData.getAppInfoURI() + "appInfo?appId=:appId" } }, getAllAppHistory: { method: 'GET', headers: { 'Accept': 'application/json' }, // 改为函数,每次调用接口时动态获取最新URI url: function() { return environmentData.getHistoryURI() + "apps?history=Y&version=1" } } });
方案2:封装接口方法动态生成$resource(兼容低版本AngularJS)
如果你的AngularJS版本低于1.3不支持url函数,可以把直接返回$resource实例的逻辑,改成返回封装后的接口方法,每次调用时用最新的环境数据创建临时$resource实例:
angular.module('mbapp.sm') .factory('coreService', coreService); coreService.$inject = ['$resource','environmentData']; function coreService($resource,environmentData) { // 封装getAppInfo方法,每次调用拉取最新URI function getAppInfo(params) { return $resource(environmentData.getAppInfoURI(), null, { get: { method: 'GET', headers: { 'Accept': 'application/json' }, url: environmentData.getAppInfoURI() + "appInfo?appId=:appId" } }).get(params); } // 封装getAllAppHistory方法,每次调用拉取最新URI function getAllAppHistory(params) { return $resource(environmentData.getHistoryURI(), null, { get: { method: 'GET', headers: { 'Accept': 'application/json' }, url: environmentData.getHistoryURI() + "apps?history=Y&version=1" } }).get(params); } return { getAppInfo: getAppInfo, getAllAppHistory: getAllAppHistory } }
该方案同样完全兼容原有控制器的调用逻辑。
内容的提问来源于stack exchange,提问作者Sby
相关产品推荐
相关产品推荐

