Angular 7:服务实例无法正常工作

问题描述 投票:1回答:1

我的应用程序中有两个组件-“过滤器”和“家”。这两个组件是应用程序组件的子组件。

我有一个我要通过服务从过滤器组件传递到家庭组件的以下对象。并且由于我希望每当过滤器组件发生更改时在home组件中更新这些数据,因此我在服务中使用BehaviorSubject。

模型:filter-response.model.ts

export interface FilterResponse{
    filter:string;
    filterlist:string[];
}

filter.component.ts

export class FilterComponent implements OnInit {
    filterMainList:FilterResponse[]=[
        {
            "filter": "abc",
            "filterlist": ["a","b","c"]
        },
        {
            "filter": "def",
            "filterlist":["d","e","f"]
        },
        {
            "filter": "ghi",
            "filterlist": ["g","h","i"]
        }
    ];
    constructor(private filterService:FilterService,) {
        this.filterService.setFilterConditions(this.filterMainList);
    }
    ngOnInit() {
    }
}

在家庭组件中,我收到了数据,我想对其进行一些更改。

home.component.ts

export class HomeComponent implements OnInit {
  constructor(private filterService:FilterService) {
    this.filterService.getFilterConditions().subscribe((data)=>{
      let tc:FilterResponse[]=data
      for(let f in tc){
        tc[f].filterlist=['changes'];//this is where I make the changes
      }
    });
   }
  ngOnInit() {
  }
}

我有一个具有行为主题的过滤器服务。这就是我感到困惑的地方。我将数据记录在服务中的next()之前,而我实际得到的数据是我在home组件中更改的数据,这意味着我对home组件中的数据实例所做的更改也影响(更改)了服务中的数据。

filter.service.ts

@Injectable({
    providedIn:'root'
})
export class FilterService{
    private filterConditions = new BehaviorSubject<FilterResponse[]>(null);
    constructor(){}
    setFilterConditions(filterList:FilterResponse[]){
        console.log(filterList);//data changes incorrectly
        this.filterConditions.next(filterList);
    }
    getFilterConditions():Observable<FilterResponse[]>{
        return this.filterConditions.asObservable();        
    }
}

我的控制台日志:

console log

实际上应该是我刚刚在过滤器组件中传递的数据。但是它将显示我在家庭组件中修改的数据。

最后是app.component.ts,如果有帮助的话

app.component.ts

<app-filter></app-filter>
<app-home></app-home>

我想提醒您的另一件事是。我试图在stackblitz中重新创建场景。但是问题在于它在这里工作正常。

https://stackblitz.com/edit/angular-ivy-9th5pj

请解释一下我在项目中缺少的内容。还是这是服务将按角度工作的实际方式。

angular typescript angular7 angular-services behaviorsubject
1个回答
0
投票

在您的服务文件中进行此更改

 setFilterConditions(filterList:FilterResponse[]){
    this.filterConditions.next(JSON.parse(JSON.stringify(filterList)));
}

这将克隆您的数组。还有很多其他方法可以在JS中克隆对象/数组Different ways to Clone object in JS

© www.soinside.com 2019 - 2024. All rights reserved.