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());
}
关键字声明私有变量。
此工厂由多个服务实例化,其中每个服务都为初始化提供自己的值。但是工厂仍然是单例,所以第二次初始化它会覆盖第一个服务使用的私有变量。
是否有最佳做法可以防止这种情况发生?
如果没有 - 您能否建议一个解决方案(即使它需要删除私有变量)?
答案 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