角度6变化检测-ngOnChanges不触发深层嵌套对象

时间:2019-07-01 08:17:22

标签: javascript angular angular6

我有一个如下物体

result =   [{
        "name": "jmd",
        "children": [
          {
            "name": "ppp1",
            "children": [
              {
                "name": "feeder",
                "children": [
                  {
                    "name": "rmu1",
                    "children": [
                      {
                        "name": "IT1",
                        "children": [
                          {
                            "aname": "Asset123",
                            "value" : "233"   
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          }]

每次使用ngOnchanges的{​​{1}}事件更改值时,我都需要检测更改。

似乎有角Angular 6不能检测到深度嵌套的对象。我尝试过类似

的操作
ngOnchanges

什么都没有,任何帮助将不胜感激:)

2 个答案:

答案 0 :(得分:0)

this.chartData = Object.assign({}, result);
this.chartData = {...result};

这不会克隆整个对象,它只会更改顶根对象,例如 如果您有这样的物体

var car = {
 model :"bmw",
 wheel:{
  type:"rounded",
  color:"black"
 }
}

然后您使用分配

let anotherCar = {...car} //or Object.assign it's almost same)

car对象将是新的,而wheel对象将是相同的,而car和anotherCar将引用同一对象,因此您必须进行深度克隆,目前最简单的方法是使用JSON方法

var newCar = JSON.parse(JSON.stringify(car)); // it will create whole new object

答案 1 :(得分:0)

有关Object.assign(){...obj}对象复制的快速说明: 它们都对对象进行了的复制,这意味着将仅复制自己的顶级属性

一个例子:

const obj = {a: 5};
const withNested = {b: 4, nested: obj};

const copy = {...withNested};

copy.nested === withNested.nested // outputs 'true' meaning the objects are the same and have not been copied

上面的代码显示嵌套对象将不会被克隆。 为了使您的代码正常工作,请手动进行深度克隆:{...a, b: {...source.b}}或使用lodash的{​​{3}}