我有一个私有的currJobs
成员,我在服务中使用它,并使用getter和setter方法来访问它。
此外,如果用户选择编辑特定作业,我使用“查找”功能,该功能应该返回作业对象的副本(返回值 - *),然后当用户保存编辑的作业时,使用另一个方法用新的替换现有的作业对象(当然还有对服务器的补丁请求)
相反,它似乎将一个引用(&)返回到所谓的私人'currJobs'成员, 这会导致服务随着模型中的每次更改而立即发生变化。 这意味着即使使用没有按下保存,对象也会在前端更新。
我搜索了Google并遇到了这个SO question,但它没有解决'返回{}构造'问题之外的'私人服务成员。
我想知道怎么可能,什么是好的,健康的和'好的做法' 这个问题的解决方案
代码:
app.service('jobsService', function($http, $q, $location, $rootScope, companyService, utils){
var that = this;
that.currJobs = null;
var jobServ = {};
jobsServ.jobsLookup = function(jid, cid) {
if(!that.currJobs || !that.currJobs[cid] || that.currJobs[cid].length == 0){
return false;
}
for(var i = 0; i < that.currJobs[cid].length; i++){
if(jid == that.currJobs[cid][i].id){
var job = that.currJobs[cid][i];
return job;//the following returns a refference
}
}
return false;
},
jobsServ.replaceJob = function(jobData, cid){
if(!that.currJobs)
that.currJobs = {};
if(!that.currJobs[cid])
that.currJobs[cid] = [];
if(that.currJobs && that.currJobs[cid] && that.currJobs[cid].length == 0){
that.currJobs[cid].push(jobData);
return;
}
}
答案 0 :(得分:1)
根据this,JavaScript传递任何不是原语(int,bool,string)作为参考,所以我的封装显然不起作用。
添加了以下代码:
app.factory('utils', function(){
return{
clone: function(obj) {
if (null == obj || "object" != typeof obj) return obj;
var copy = obj.constructor();
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
}
return copy;
}
}
}
app.service('jobsService', function($http, $q, $location, $rootScope, companyService, utils){
var that = this;
that.currJobs = null;
var jobServ = {};
jobsServ.jobsLookup = function(jid, cid) {
if(!that.currJobs || !that.currJobs[cid] || that.currJobs[cid].length == 0){
return false;
}
for(var i = 0; i < that.currJobs[cid].length; i++){
if(jid == that.currJobs[cid][i].id){
var job = utils.clone(that.currJobs[cid][i]);//Fix the problem
return job;
}
}
return false;
}
}