AngularJS:多个工厂实例任何原型继承

时间:2016-04-07 13:13:08

标签: javascript angularjs inheritance factory

Plunker(可能在下面没有我的描述的情况下解释这个问题)

我的Angular-App中有以下构造(参见Angular Services参考):

我使用了一个实现多个功能的工厂BaseService.prototype。我在var上定义了这些函数,以便稍后公开(也请参阅上面的链接)。

使用try { JSONArray companiesJson = response.getJSONArray("GetCompaniesResult"); for (int i = 0; i < companiesJson.length(); i++) { JSONObject obj = Website.getJSONObject(i); Company company = new Company(); company.setCompanyId(Integer.parseInt(obj.getString("CompanyId"))); Log.v(TAG, "COMPANIES setCompanyId:" + obj.getString("CompanyId")); company.setCompanyName(obj.getString("CompanyName")); Log.v(TAG, "COMPANIES setCompanyName:" + obj.getString("CompanyName")); companies.add(company); } } catch (JSONException e) { Log.v(TAG, "COMPANIES RESPONSE ERROR ON PARSING JSON:" + e.getMessage()); } 关键字声明私有变量。

此工厂由多个服务实例化,其中每个服务都为初始化提供自己的值。但是工厂仍然是单例,所以第二次初始化它会覆盖第一个服务使用的私有变量。

是否有最佳做法可以防止这种情况发生?

如果没有 - 您能否建议一个解决方案(即使它需要删除私有变量)?

2 个答案:

答案 0 :(得分:1)

您应该使用this而不是全局变量updated plunkr

答案 1 :(得分:1)

您可以保留一个静态私有变量,该变量包含每个工厂实例的私有数据。在实例化工厂时,会为其实例分配一个唯一的id(也是一个静态私有变量),并且该唯一ID也是数据数组的关键。

  var privateVars = {};   // has contained private vars for each instance
  var baseServiceId=0;    // unique id assigned to each instance

  var BaseService = function(initval){
    this.baseServiceId = ++baseServiceId;
    privateVars[this.baseServiceId] = {"storedVal":initval};
  };

  BaseService.prototype.plusone = function(){
    pv = privateVars[this.baseServiceId].storedVal;
    privateVars[this.baseServiceId].storedVal = pv+1;
  };
  BaseService.prototype.getVal = function(){
    return privateVars[this.baseServiceId].storedVal;
  };

这是更新的plunkr:http://plnkr.co/edit/56oXXvl75zH4mTfAqMsd?p=preview