AngularJS - 对象在副本上丢失值

时间:2017-07-07 13:49:33

标签: javascript angularjs json object deep-copy

所以,我有这个巨大的对象(它是一个餐馆菜单),我想只保存我更改的字段。我发现做到这一点的最好方法是拥有一个"原创"并将其与对象的修改版本进行比较。 问题是,无论我使用什么方式进行深层复制,都会让我失去一些信息。 我试过了

this.menu = menu;    
this.oldMenu = JSON.parse(JSON.stringify(this.menu));

this.menu = menu;
this.oldMenu = angular.copy(this.menu);

并且它们都返回不同的数组(副本中缺少所有布尔变量和菜单的最后一个块)。 然后,我尝试在php文件中创建两个变量,并单独使用它们,如下所示:

<script type="text/javascript">
  menu         = <?= ($menu) ? json_encode($menu) : 'false' ; ?>;
  menuCopy     = <?= ($menu) ? json_encode($menu) : 'false' ; ?>;
</script>

然后

this.menu = menu;
this.menuCopy = menuCopy;

但我得到完全相同的问题:副本错过了相同的变量。关于它的奇怪之处在于,如果我颠倒这样的顺序:

this.menuCopy = menu;
this.menu = menuCopy;

它仍然是this.menuCopy,错过了变量。

我没有看到什么?我在某处读到JSON在复制时忽略了布尔值,这是真的吗? Angular会做同样的事情吗?如果是这样的话,怎么做这个重复?

编辑: 我编辑了一个菜单,但基本上,我得到其中一个:

{"id":2442,"categories":[{"id":13364,"itens":[{"id":136056},
{"id":136057,"daily_promo":null}],
"daily_promo":null}],"daily_promo":null} 

和另一个像这样:

{"id":2442,"categories":[{"id":13364,"itens":[{"id":136056,"update_price":false},
{"id":136057,"daily_promo":null,"update_price":false}],
"daily_promo":null,"itens_length":[{"id":136056,"name":"teste 1","category_id":13364,"daily_promo":null,"update_price":false},{"id":136057,"name":"teste 2","category_id":13364,"daily_promo":null,"update_price":false}]}],"daily_promo":null} 

代码没有更多内容,它非常像:

angular.module('menu', [])
    .controller('MenuController', ['$rootScope', '$scope', '$http', function($rootScope, $scope, $http){

        this.restaurant                 = (restaurant) ? restaurant : false ;
        this.oldRestaurant = angular.copy(this.restaurant); 
}

然后是HTML:

<div ng-controller = "CulinaryController as CulinaryController">
        ORIGINAL MENU <br/>
        {{MenuController.oldRestaurant.menu}}
        <br/><br/><br/>
        CHANGED MENU <br/>
        {{MenuController.restaurant.menu}}
</div>
    <script type="text/javascript">
      restaurant = <?= ($restaurant) ? json_encode($restaurant) : 'false' ; ?>;
    </script>

$restaurant来自我的控制器(我正在使用Cakephp)。

0 个答案:

没有答案