2013-05-08 83 views
0

我有一个角度范围,看起来是这样的:更深,比这更复杂的角:深范围遍历和更新

{ 
    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, 
    } 
} 

这显然太多(很多)。

在制做各种动作(比如,将“狗”到“菲多”),我的服务器将返回新更新,在一组像看似无关的数据...

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

我发现的各种方式遍历范围来查找101,001节点,但它们都涉及将范围节点的副本发送到遍历函数,更新副本中的属性是毫无价值的。我怎样才能告诉函数在正确的地址更新范围,或通过引用更新节点属性? (或者是解决方案与在DOM中设置data =“show”属性一样愚蠢,在Angular之外更新DOM,然后设置scope.apply()请求?我的范围很不好.apply()...)

+0

所以“角度的方式”是让你的模型存在于最上面的通用范围内。例如,如果这是根作用域,那么仅通过将$ rootScope注入到控制器中就无法实现了吗? – 2013-05-08 22:24:37

+0

当你在JavaScript中传递对象到任何通过值传递的函数,但传递的值实际上是一个引用而不是对象本身,所以它更新遍历函数的范围propeties它不会是一个毫无价值的工作。此链接将使其更加清晰:http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language – 2013-05-09 05:08:05

+0

回复:Ram - 如果你是这表明我重新加载了根控制器中的整个数据集,导致接口重新加载,从而导致用户以相当复杂的形式失去他的位置。 – user2246897 2013-05-10 14:42:06

回答

0

解决方案是双重的。

首先,根据this example深入遍历$ scope.data(存储json)。

二,通过引用更新,如Ajay描述。

使用上述移动()函数...

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的协助,以及堆栈溢出在逃。我们生活的是多么美好的世界。