AngularJS深度监视模板中的对象绑定吗?

AngularJS深度监视模板中的对象绑定吗?,angularjs,Angularjs,我目前正在AngularJS应用程序中重写文件树。文件树在后面的实现方式包括FileInfos、DirectoryInfos和DirectoryEntrys。基本上,文件和目录可以挂接在任意多个目录中,因为目录只包含指向特定文件或目录ID(甚至指向父ID)的条目,所以您可以在其中循环。我认为这不是一个理想的API,但已经完成了 我之所以提出后端API,是因为它与前端实现完全相关。基本上,每个节点都有一个ID,指向它所对应的文件或目录,但仅此ID无法告诉您节点在层次结构中的位置。因此,在执行诸如添

我目前正在AngularJS应用程序中重写文件树。文件树在后面的实现方式包括
FileInfo
s、
DirectoryInfo
s和
DirectoryEntry
s。基本上,文件和目录可以挂接在任意多个目录中,因为目录只包含指向特定文件或目录ID(甚至指向父ID)的条目,所以您可以在其中循环。我认为这不是一个理想的API,但已经完成了

我之所以提出后端API,是因为它与前端实现完全相关。基本上,每个
节点
都有一个ID,指向它所对应的文件或目录,但仅此ID无法告诉您节点在层次结构中的位置。因此,在执行诸如添加/删除/重命名目录条目之类的操作时,您不仅必须知道条目名称/ID,还必须知道父项。要做到这一点,我们可以将节点数组与父节点和子节点一起传递(我们过去所做的),或者将节点映射到它们的父节点,但这两种解决方案都非常混乱。理想情况下,前端中的实现将是一个双链接图,其中每个目录节点都有其子节点的列表,并且每个子节点都有对父节点的引用

我很清楚,可以调用
scope.$watch(expression,listener,true)
递归地查看对象的所有属性。但是,对于与
节点
类远程相关的任何内容,都不会调用此函数。然而,仅仅使用下面的递归模板,AngularJS就开始受到
循环对象值
错误的影响

<!-- Recursive node template -->
<script type="text/ng-template" id="tree-pane_node.html">
    <div style="padding-left: {{ level * 24 }}px" ng-click="$ctrl.navigateTo(node)">
        <a ng-click="$ctrl.toggleOpen(node); $event.stopPropagation()">
            <md-icon class="mdi mdi-24px" ng-class="node.isOpen ? 'mdi-chevron-down' : 'mdi-chevron-right'"></md-icon>
            <md-icon class="mdi mdi-24px mdi-{{ node.icon }}"></md-icon>
        </a>
        <span>{{ node.name }}</span>
    </div>
    <div ng-if="node.isOpen">
        <div ng-repeat="node in node.children | filter:{isDir: true} | orderBy:'name'" ng-init="level = level + 1">
            <div ng-include="'tree-pane_node.html'"></div>
        </div>
    </div>
</script>

<!-- Kick off the recursion with the top-level (special) directories -->
<div ng-repeat="node in ::$ctrl.topLevelDirectories" ng-init="level = 0" ng-include="'tree-pane_node.html'"></div>

{{node.name}
注意:为了简洁起见,我省略了CSS类以及一些表达式回调,如
ng右键单击

应用程序中的任何位置都没有到
节点.parent
的模板绑定。那么为什么我会得到
循环对象值
错误AngularJS是否默认深度监视模板绑定?如果是这样,我可以关闭它吗?正如我前面所说,我目前正在重写代码的文件树部分,我知道此错误是由于在节点上存储父引用而出现的,而不是由于应用程序中的其他原因



我注意到错误源于
JSON.stringify()

AngularJS使用一个字符串的浅表来字符串化它所监视的模板中的对象。
ng repeat
指令使用
$watchCollection
对集合中的每个项目进行浅表监视

我注意到错误源于
JSON.stringify()

模板中使用双花括号(
{{}}
)绑定的所有表达式都是字符串化的。我个人更愿意看到对象的内容,而不是
“[object object]”

若要查看模板中具有循环参照的对象,请对其进行过滤以删除循环参照。可以使用Douglas Crockford实现的
JSON.decycle
方法。看看他的。这允许您将几乎任何标准结构字符串化

有关详细信息,请参阅

  • =>

AngularJS使用一个字符串的浅表在其监视的模板中对对象进行字符串化。
ng repeat
指令使用
$watchCollection
对集合中的每个项目进行浅表监视。@georgeawg我注意到错误源于
JSON.stringify()
,但我找不到在AngularJS中调用它的位置。您的意思是说模板中引用的所有对象都被序列化为JSON以进行脏检查吗?如果是这样的话,这似乎是一个有问题的框架设计。我知道
ng repeat
必须观察数组的元素,但它不需要深入检查每个元素(从而在
elem.parent
中循环)。问题中的代码工作正常。看看哪里可以找到问题的根源。我仍然认为有一个错误的沟通。我不尝试在模板中显示整个节点,即
{{node}
。我绑定到特定属性,如
{{node.name}
ng repeat=“child in node.children”
。这两个绑定都不需要遍历整个对象,那么为什么Angular要串接整个节点呢?问题中的代码按预期工作。看看哪里可以找到问题的根源。您的代码实际上调用了
JSON.stringify()
。我知道是
JSON.stringify()
引发了错误。问题仍然存在:为什么安格拉斯会这样称呼?谢谢你的尝试,但是如果没有人知道答案的话,我想我将不得不挖掘AngularJS的源代码/