当前位置: 首页 > 面试题库 >

遍历ng-repeat中的深层对象

魏鹤轩
2023-03-14
问题内容

我陷入困境,我有一个这样的对象

var items = [{
    title: 'Something',
    children: [
        { title: 'Hello World' },
        { title: 'Hello Overflow' },
        { title: 'John Doe', children: [
            { title: 'Amazing title' },
            { title: 'Google it' },
            { title: 'I'm a child', children: [
                { title: 'Another ' },
                { title: 'He\'s my brother' },
                { title: 'She\'s my mother.', children: [
                    {title: 'You never know if I'm going to have children'}
                ]}
            ]}
        ]}
    ]
}];

我不会遍历所有这些,所以我有这样的事情。

•东西

• 你好,世界

•您好溢出

•约翰·杜

•惊人的标题

• 谷歌一下

•我还是个孩子

•另一个

•他是我的兄弟

•她是我妈妈

•你永远不知道我是否要生孩子

问题是我不知道这个物体会走多深或里面有什么。因此我将无法手动进行。我ng-repeat在底部提供的小提琴中完成了一个基本的循环,但是我不知道如何自动循环这些循环并创建嵌套<ul>的和<li>

做到这一点的最佳方法是什么?

演示:http://jsfiddle.net/XtgLM/


问题答案:

干得好:

html

<div ng-app="app" ng-controller="test">
   <ul>
       <li nested-item ng-repeat="item in items">{{item.title}}</li>
   </ul>         
</div>

JavaScript

var items = [{
    title: 'Something',
    children: [
        { title: 'Hello World' },
        { title: 'Hello Overflow' },
        { title: 'John Doe', children: [
            { title: 'Amazing title' },
            { title: 'Google it' },
            { title: 'Im a child', children: [
                { title: 'Another ' },
                { title: 'He\'s my brother' },
                { title: 'She\'s my mother.', children: [
                    {title: 'You never know if im going to have children'}
                ]}
            ]}
        ]}
    ]
}];

var app = angular.module('app', []);

app.controller('test', function( $scope ) {
    $scope.items = items;
});


app.directive('nestedItem', ['$compile', function($compile){
    return {
        restrict: 'A',
        link: function(scope, element){
        console.log(element);
            if (scope.item.children){
                var html = $compile('<ul><li nested-item ng-repeat="item in item.children">{{item.title}}</li></ul>')(scope);
                element.append(html);
            }
        }
    };
}]);

我分叉了你的小提琴

http://jsfiddle.net/c4Kp8/

实际上,我必须承认我喜欢道德大师的方法,但是您也可以使用自定义指令。要知道是否走这条路线的关键是,您需要在项目级别进行拦截,以手动检查当前项目是否具有子项,如果是,则$自己自己编译该节点的指令。

更新

但是,上面的代码中有一件事应该困扰我们。html代码的重复(在指令中内联)是一种代码味道。如果您愿意,可以引入一个通用template- code指令,该指令真的很时髦,并且可以解决此问题,该指令除了提供节点的代码作为其他指令的模板之外,不执行其他任何操作。

因此,我们的解决方案将如下所示:

html

<div ng-app="app" ng-controller="test">
   <ul template-code>
       <li nested-item ng-repeat="item in items">{{item.title}}</li>
   </ul>         
</div>

JavaScript

var items = [{
    title: 'Something',
    children: [
        { title: 'Hello World' },
        { title: 'Hello Overflow' },
        { title: 'John Doe', children: [
            { title: 'Amazing title' },
            { title: 'Google it' },
            { title: 'Im a child', children: [
                { title: 'Another ' },
                { title: 'He\'s my brother' },
                { title: 'She\'s my mother.', children: [
                    {title: 'You never know if im going to have children'}
                ]}
            ]}
        ]}
    ]
}];

var app = angular.module('app', []);

app.controller('test', function( $scope ) {
    $scope.items = items;
});

app.directive('templateCode', function(){
    return {
        restrict: 'A',
        controller: function(){},
        compile: function(element){
            element.removeAttr('template-code');
            //ATTENTION: We need to trim() here. Otherwise AngularJS raises an exception
            //later when we want to use the templateCode in a $compile function. 
            //Be aware that we assume a modern browser 
            //that already ships with a trim function.
            //It's easy to secure that with a polyfill.
            var templateCode = element.parent().html().trim();
            return function(scope, iElement, iAttrs, controller){
                controller.templateCode = templateCode;
            }
        }
    }
});

app.directive('nestedItem', ['$compile', function($compile){
    return {
        restrict: 'A',
        require: '^templateCode',
        link: function(scope, element, iAttr, controller){ 
            if (scope.item.children){
                scope.items = scope.item.children;         
                var html = $compile(controller.templateCode)(scope);
                element.append(html);
            }
        }
    };
}]);

jsfiddle:http://jsfiddle.net/2rQWf/



 类似资料:
  • 问题内容: 我的控制器从服务器上抓人: 我的模板每行需要显示三个人。例如,如果它是一个表: 我不确定如何有条件地应用最佳实践的时间或最佳实践。我知道如何通过向控制器添加分组逻辑来做到这一点,但我认为最好将设计逻辑排除在控制器之外。 问题答案: 经过多年的经验积累,很显然,最好的方法是在控制器中将数组拆分为多个块。每次修改原始数组时,都要更新分块数组。

  • 问题内容: 我在使用AngularJS ng-repeat时遇到了一些麻烦。这是我所拥有的: modal.data.answer数组将始终包含六个元素。我可以使用ng-repeat为其创建HTML并让它甚至重复数组中的[x]个数字,并让“ selected =”的第一行中的数字从3递增到8吗? 就我所知,我可以使用,但如何将t的值转化为类似的东西: 问题答案: 您的编辑以正确的方式进行,您可以轻松

  • 问题内容: 您将如何遍历map中的条目,以便可以同时输入条目键和值?例如,我想做这样的事情: 问题答案: 从文档中,我发现此语法有效:

  • 问题内容: 在我的控制器中,我有如下数据: 现在,此数据是包含键和值的字典。 我可以使用模板中的属性。有什么办法可以遍历键并将它们显示在表格中吗? 数据是这样的 问题答案: 怎么样: 该方法在docs中列出:https : //docs.angularjs.org/api/ng/directive/ngRepeat

  • 层次遍历 给定二叉树的包含虚结点的先序遍历序列信息,按层次顺序给出遍历的结果。 输入格式: 首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据在一行中输入一个字符串(不含空格且长度不超过80),表示二叉树的先序遍历序列(其中@表示虚结点)。 输出格式: 对于每组测试,输出层次遍历的结果。 输入样例: 1 ABD@@EG@@@C@F@@ 输出样例: ABCDEFG 代码长度限制

  • 问题内容: 我想使用父列表(foos)的索引作为子列表(foos.bars)中函数调用的参数。 我发现了有人建议使用$ parent。$ index的帖子,但不是的属性。 如何访问父级的索引? 问题答案: 我的示例代码是正确的,问题出在我的实际代码中。不过,我知道很难找到这样的例子,所以我在回答别人的情况。