防止Angular范围变量通过引用自动绑定到服务私有成员

时间:2013-12-03 10:01:05

标签: angularjs angularjs-service javascript

我有一个私有的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;
    }
}

1 个答案:

答案 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;
  }
}