修改组件中的局部变量会修改Angular 2中的共享服务变量?

修改组件中的局部变量会修改Angular 2中的共享服务变量?,angular,Angular,这是我的服务: import { Injectable } from '@angular/core'; import { Headers, Http, Response } from '@angular/http'; import { Observable } from 'rxjs/Rx'; import 'rxjs/observable/of'; import 'rxjs/add/operator/share'; import 'rxjs/add/operator/map'; import

这是我的服务:

import { Injectable } from '@angular/core';
import { Headers, Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Rx';

import 'rxjs/observable/of';
import 'rxjs/add/operator/share';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

@Injectable()
export class CaseService {

    private data:any;
    private observable: Observable<any>;

    constructor(private _http: Http) {}

    public GetCase() {

         const url = 'http://localhost:55130/api/case?caseId=123';

         if (this.data) {
             //after filtering an array of objects on a local variable
             //in a controller, this.data is now modified
             console.log(this.data);
             return Observable.of(this.data);
         } else if (this.observable) {
            return this.observable;
         } else {
             let headers = new Headers();
            headers.append('Content-Type', 'application/json');
             this.observable = this._http.get(url,{headers:headers})
                 .map(response => {
                    this.observable = null;
                    this.data = response.json();
                    return this.data;
                 }).share();
                 return this.observable;
        }

    }
}

为什么当我修改主控制器中的局部变量时,它会修改共享服务中的变量。基本上,我要做的是,当我进入主页时,我过滤掉主页的内容,然后当我访问联系人页面时,我再次从缓存和文件管理器中获取完整对象,过滤掉联系人页面的内容,但是当我进入联系人页面时,CaseContent现在是一个对象,而不是一个对象数组。

您使用的是同一个“data”变量实例。 从方法返回引用类型不会克隆/复制该对象,它只是创建新指针(指向内存中的同一对象)

您可以通过删除内部缓存来解决此问题:

@Injectable()
export class CaseService {

  constructor(private _http: Http) {}

  public GetCase() {

     const url = 'http://localhost:55130/api/case?caseId=123';
     let headers = new Headers();
     headers.append('Content-Type', 'application/json');
     return this._http.get(url,{headers:headers})
             .map(response => {
                return response.json();
             });
  }
}
或者,如果您真的想缓存可观察对象和数据,那么您应该在返回时克隆该对象,类似于“return observable.of(DeepClone(this.data));”

在google中搜索如何在js中深度克隆对象,或实现自定义方法

在您的情况下,最好只缓存字符串json响应,并在每次访问时调用“json.parse()”

this.data = response.text();
return JSON.parse(this.data);

您使用的是“data”变量的同一个实例。 从方法返回引用类型不会克隆/复制该对象,它只是创建新指针(指向内存中的同一对象)

您可以通过删除内部缓存来解决此问题:

@Injectable()
export class CaseService {

  constructor(private _http: Http) {}

  public GetCase() {

     const url = 'http://localhost:55130/api/case?caseId=123';
     let headers = new Headers();
     headers.append('Content-Type', 'application/json');
     return this._http.get(url,{headers:headers})
             .map(response => {
                return response.json();
             });
  }
}
或者,如果您真的想缓存可观察对象和数据,那么您应该在返回时克隆该对象,类似于“return observable.of(DeepClone(this.data));”

在google中搜索如何在js中深度克隆对象,或实现自定义方法

在您的情况下,最好只缓存字符串json响应,并在每次访问时调用“json.parse()”

this.data = response.text();
return JSON.parse(this.data);