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

Prevent from Angular scope variables to bind automatically to the service private members by reference

本文关键字:绑定 服务 成员 范围 Angular 变量 引用 防止      更新时间:2024-02-15

我有一个在服务内部使用的私有currJobs成员,并使用getter和setter方法来访问它。此外,如果用户选择编辑特定的作业,我会使用"查找"功能,该功能应该返回作业对象的副本(返回值-*),然后当用户保存编辑后的作业时,我会用另一种方法将现有的作业对象替换为新的作业对象(当然还有向服务器发出的补丁请求)

相反,它似乎返回了对所谓的私人"currJobs"成员的引用(&),这会随着模型的每次改变而导致服务的立即改变。这意味着即使使用没有按save,对象也会在前端更新。

我在谷歌上搜索过,遇到了这个SO问题,但它没有解决"私人服务成员,返回{}结构之外"的问题。

我想知道这怎么可能,什么是好的、健康的和"好的做法"这个问题的解决方案

代码:

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

根据这一点,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;
  }
}