【发布时间】:2016-09-27 02:19:54
【问题描述】:
上下文
我正在为我的 web 应用程序使用 Typescript/Angular2 RC1,并且我有两个类。在 class1(Angular2 服务)中,我有一个变量 myVar = [obj1, obj2, obj3],在 class2(Angular2 组件)中,我在使用 viewInjector 注入服务的构造函数中得到 myLocalVar = class1.myVar。
问题
在 class2 中,我使用 push 复制 myVar(浅复制,因为它复制对象)所以 myLocalVar 等于 [obj1, obj2, obj3](这样 objX={number:X})。当我更改一项例如:myVar[0]={number:5} in class1 时,更改不会出现在我的 class2 中 myLocalVar 和 myLocalVar[0].number 将等于 1。但是,class2 的myVar 发生了变化……看来this.myLocalVar.push(this.myVar[int]); 创建了深拷贝而不是浅拷贝。
Typescript 是否会改变 Javascript 中 push 的行为?如果是,我应该怎么做才能保留引用并做浅拷贝?
代码示例
@Injectable()
export class Class1{
public myVar:any[];
constructor(){
this.myVar = [{number: 1}, {number: 2}, {number: 3}];
}
changeVar(newVar):void{
this.myVar[0] = newVar; // newVar = {number: 5}
}
}
@Component({
selector: 'class2',
viewInjector: [Class1],
templateUrl: 'someURL'
})
export class Class2{
private myLocalVar:any[] = [];
constructor(class1: Class1){
this.myVar = class1.myVar;
}
showVars():void{
console.log(this.myLocalVar[0]);
console.log(this.myVar[0]);
}
ngOnInit(){
for(let int = 0; int < this.myVar.length; int++){
this.myLocalVar.push(this.myVar[int]);
}
}
}
console.log 将打印两个不同的值:console.log(this.myLocalVar[0]) 打印1 和console.log(this.myVar[0]); 在changeVar() 被第三方调用后打印5!
编辑
这是一个证明问题的plunker:
- 单击显示,检查您的控制台,您将看到相同的值
- 点击更改
- 再次单击显示,您将看到
myVar和myLocalVar的两个不同值
我需要的是每次更改myVar[x]=newObj 我希望myLocalVar 反映该更改。如果您希望您的答案得到验证,请提供该问题的解决方案。
【问题讨论】:
-
我认为您的错误是认为
push创建了副本。您可以轻松地将相同的对象引用推送到多个数组。如果您需要副本,请尝试使用angular.copy() -
@charlietfl 我知道
push做了浅拷贝,但似乎在这种情况下它做了深拷贝!否则,为什么我会得到两个不同的值? -
创建一个复制问题的简单演示。我怀疑 angular2 重载
Array.push是否会让开发人员感到麻木,从而违反良好做法 -
"我知道 push 做了一个浅拷贝" --- 它不做任何拷贝。
-
您正在覆盖整个对象而不更改其属性
this.myVar[0] = {number:newVar};与this.myVar[0].number=newVar不同。这就是为什么你认为它是一个副本,但你完全破坏了原始参考
标签: javascript typescript angular