0

我有一个看起来像这样的 Angular 范围:

{
  node_type: 100, node_instance: 001, value: 'pony', show: true, childNodes: {
    node_type: 100, node_instance: 011, value: 'cat', show: false, childNodes: {
      node_type: 101: node_instance: 001, value: 'apple'show: true, 
    }
    node_type: 100: node_instance: 012, value: 'kitty', show: true, 
    node_type: 100: node_instance: 013, value: 'meow', show: true, 
  }
  node_type: 100, node_instance: 002, value: 'horse', show: true, childNodes: {
    node_type: 102: node_instance: 001, value: 'dog', show: false, 
    node_type: 100: node_instance: 014, value: 'mutt', show: true, 
  }
}

它显然比这更深更复杂。

在进行各种操作后(例如,将“mutt”更改为“Fido”),我的服务器将返回一组新更新的、看似无关的数据,例如……</p>

{ node_type:101, node_instance:001, show:false }

我找到了各种遍历范围以找到 101,001 节点的方法,但它们都涉及将范围节点的副本发送到遍历函数,更新副本中的属性是毫无价值的。如何告诉函数更新正确地址的范围,或通过引用更新节点属性?

(或者解决方案是否像在 DOM 中设置 data="show" 属性,在 Angular 之外更新 DOM,然后设置 scope.apply() 请求一样愚蠢?我运气不好 scope.apply() …)

4

1 回答 1

0

解决方案是双重的。

首先,按照此示例深入遍历 $scope.data(存储 json) 。

其次,如 Ajay 所述,通过引用进行更新。

使用上面的 traverse() 函数……</p>

for( var i = 0; i < response.nodes.length; i++ ) {
    traverse( $scope.data, response.nodes[i], 
        function(key, val, update) {
            if( val != null && typeof val.node_type != 'undefined' 
                && update.node_type == val.node_type 
                && update.node_instance == val.node_instance 
            ) {
                val.show = update.show;
            }
        }
    );
}

感谢 Ajax 和 Stack Overflow 的帮助。我们生活在一个多么了不起的世界。

于 2013-05-10T16:04:37.157 回答