You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:39:01