Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 修改从组件传递到服务的对象_Angular - Fatal编程技术网

Angular 修改从组件传递到服务的对象

Angular 修改从组件传递到服务的对象,angular,Angular,我试图通过将公共组件方法放入共享服务来重构代码,但是我不确定为什么我不能覆盖传递给服务的组件的公共对象属性,尽管我似乎能够修改特定的对象属性 具体来说,这不起作用: 组成部分: public data: any; ngOnInit(): void { loadData(this.data); console.log(this.data); // <-- returns undefined } 但是,如果我将类似{test:'te

我试图通过将公共组件方法放入共享服务来重构代码,但是我不确定为什么我不能覆盖传递给服务的组件的公共对象属性,尽管我似乎能够修改特定的对象属性

具体来说,这不起作用:

组成部分:

   public data: any;    

    ngOnInit(): void {
       loadData(this.data);
       console.log(this.data); // <-- returns undefined
    }
但是,如果我将类似{test:'test'}的对象传递给服务,并在服务中修改它(例如set data.test='test2'),这似乎是可行的……正如我所期望的,组件将具有修改后的值

我的问题是,既然假定对象是通过引用传递的,为什么我不能为传递给服务的对象分配一个新对象呢?angular是否在做一些事情来保护组件属性不发生变异,如果是,它是否可以被旁路

顺便说一句,我知道我可以简单地从loadData返回一个值并在组件中进行赋值,但是,这对我想要重构的更复杂的方法没有帮助,这些方法可能有多个对象被传递到服务并在服务方法中修改

任何见解都值得赞赏


-S.Arora

您仍然可以更新组件数据。但它看起来是这样的:

loadData(data) {
    data.test = 'test';
}
因为您只想覆盖对象的属性,所以这就足够了。虽然我会添加条件来检查对象是否存在,因为如果不检查,这将抛出错误。所以也许:

loadData(data) {
  if (data) {
    data.test = 'test';
  }
}

为什么您的案例不起作用,我不是100%确信,但可能是因为您试图分配一个全新的对象(新引用),而在我的案例中,引用保持不变。

我感谢您的回答。如果不清楚,很抱歉,但我知道我可以更新属性,但问题是如何为通过引用传递的对象分配一个全新的值。我希望我能理解我遇到的是什么(例如javascript或其他特定角度的东西),以及我的选项是什么,这样我就可以确定如何重构大量冗余代码。你的评论让我想到,通过赋值,它会破坏对象引用。现在,我想在我的loadData方法中,我可以执行类似data=Object.assign(data,{test:'test'})的操作来保留对象引用。如果有人对如何维护对象引用有任何其他相关建议,我非常感谢反馈。我明白了。好的,另一个选择是在组件中为
this.data
赋值,但您只需执行一次,在服务中您将返回整个对象。为什么你不能指定你的写作方式,我其实不太确定。通常(“通常”仅代表我自己)您不会传递一个对象以用另一个对象覆盖,而是返回一个新对象并对组件进行赋值,或者只更新一些字段。若要添加更多,我认为在服务级别上进行修改不是一个好主意的另一个原因是,在开发的后期,您可能会面临获得意外值的情况。如果在多个文件之间拆分工作分配/更新,则可能很难跟踪更改。:)总的问题是,我有4个组件在做类似的事情,很多组件方法都是相同的,例如加载数据,或者根据其他属性的值等条件修改特定属性。因为这些方法可能依赖于多个组件属性,并且我想修改多个属性,所以我需要一种比只接受单个输入并返回它更可靠的方法。i、 e.一种将组件方法移动到服务的方法,这种方法通常都是有效的,而不仅仅是针对一个示例。
loadData(data) {
  if (data) {
    data.test = 'test';
  }
}