AngularJs数据递归呈现的实现的几种方式

在实践中,常常会有数据结构一致但深度不确定的数据。而通常情况下,对数据的处理会用到递归的方式。例如网站的无限级分类的展现,分类数据结构:

var cate = [
    {
        cateId: 1,
        cateName: '前端技术',
        child: [
            {
                cateId: 4,
                cateName: 'JavaScript'
            },
            ...
        ]
    },
    {
        cate: 2,
        cateName: '后端技术',
        child:[
            {
                cateId: 3,
                cateName: 'PHP',
                child: [
                    {
                        cateId: 6,
                        cateName: 'ThinkPHP'
                    },
                    ...
                ]
            }
        ]
    }
];
用jq常常通过如下方式实现,示例代码如下:

/**
 * * 解析模板文件
 * @param template  模板字符串
 * @param scope     模板作用域
 * return [string]  解析过后的字符串
 */
function templateParse(template, scope) {
    if(typeof template != "string") return ;
    return template.replace(/\{\w+\}/gi, function(matchs) {
        var returns = scope[matchs.replace(/(\{)|(\})/g, "")];
        return (returns + "") == "undefined"? "": returns;
    });
}
 
/**
 * 解析并插入分类
 */
$('#category').append(function(){
    var template = '<a href="{cateId}.html">{cateName}</a>';
    var ret = (function(c){
        if(!c || !c.length) return '';
        var ret = '<ul>';
        for(var i = 0, j = c.length; i < j; i++){
            ret += '<li>';
            ret += templateParse(template, c[i]);
            ret += arguments.callee(c[i].child);
            ret += '</li>';
        }
        return (ret + '</ul>');
    })(cate);
 
    return ret;
});
以上页面可以点击"jq实现无限级分类展示演示DEMO",查看对应结果。

angularJs中基于模板递归的实现

同样的原理,可以通过组合angularJs内置的ng-include、ng-init来达到递归的效果,示例模板如下:

<script id="recursion" type="text/ng-template">
    <li ng-repeat="item in cate">
        <a href="{{item.cateId}}">{{item.cateName}}</a>
        <ul ng-if="item.child.length" ng-include="'recursion'"  ng-init="cate=item.child"></ul>
    </li>
</script>
调用方式如下:

<div ng-app="demo">
    <div ng-controller="demo">
        <ul ng-include="'recursion'"></ul>
    </div>
</div>
实现效果演示DEMO,"AngularJ基于模板递归实现分类展示"

基于指令递归的实现

同样的道理,在指令中,咱们可以这么来干(内容参考自angular-recursion):

angular.module('demo').directive('recursion',function($compile){
 
    function cpl(element, link){
        // Normalize the link parameter
        if(angular.isFunction(link)){
            link = { post: link };
        }
 
        // Break the recursion loop by removing the contents
        var contents = element.contents().remove();
        var compiledContents;
        return {
            pre: (link && link.pre) ? link.pre : null,
            /**
             * Compiles and re-adds the contents
             */
            post: function(scope, element){
                // Compile the contents
                if(!compiledContents){
                    compiledContents = $compile(contents);
                }
                // Re-add the compiled contents to the element
                compiledContents(scope, function(clone){
                    element.append(clone);
                });
 
                // Call the post-linking function, if any
                if(link && link.post){
                    link.post.apply(null, arguments);
                }
            }
        };
    }
   
    return {
        restrict:'A',
        scope: {recursion:'='},
        template: '<li ng-repeat="item in recursion">\
                        <a href="{{item.cateId}}.html">{{item.cateName}}</a>\
                        <ul recursion="item.child">\
                        </ul>\
                    </li>',
        compile: function(element){
 
            return cpl(element, function(scope, iElement, iAttrs, controller, transcludeFn){
                // Define your normal link function here.
                // Alternative: instead of passing a function,
                // you can also pass an object with
                // a 'pre'- and 'post'-link function.
            });
        }
    };
});
关于recursion指令

以上两种方式实现与模板耦合的过于紧密,有没有办法可以像如下的方式来使用呢?(未完,等续)

<ul recursion="cate">
    <li ng-repeat="item in cate">
        <a href="{{item.cateId}}">{{item.cateName}}</a>
        <ul recursion-child='item.child'></ul>
    </li>
</ul>

时间: 2025-01-20 23:36:05

AngularJs数据递归呈现的实现的几种方式的相关文章

数据导入HBase最常用的三种方式及实践分析

要使用Hadoop,数据合并至关重要,HBase应用甚广.一般而言,需要 针对不同情景模式将现有的各种类型的数据库或数据文件中的数据转入至HBase 中.常见方式为:使用HBase的API中的Put方法: 使用HBase 的bulk load 工具:使用定制的MapReduce Job方式.<HBase Administration Cookbook>一书对这三种方式有着详尽描述,由 ImportNew 的陈晨进行了编译,很有收获,推荐给大家. HBase数据迁移(1)-使用HBase的API

Android 学习之路一:Activity之间传递数据的四种方式

传递数据 新建 Activity 在项目中右键,选择 New,继续选择中下方的 Activity,最后是 Blank Activity. 此时 Android Studio 会为我们自动添加一个对应的布局文件,为布局文件中的 TextView 添加 ID,以便后续使用. 用Intent 发送数据 在主布局文件中新建一个 Button 控件,并在主类中定义它,然后为它设置 Click 的监听事件. Button button; @Override protected void onCreate(B

大数据正在改变制造业的7种方式

虽然制造业是一个有点过时的行业,但是人们可能会惊讶于其能够从使用大数据中受益.由于获得了新的分析工具和更好的收集信息的方式,制造业正在不断发展. 大数据如何改变制造业 以下是大数据正在重塑美国制造业的几种方式: 1.精度更高.成功制造取决于制造商继续具有竞争力的准确性.在大数据出现之前,最好的方法是投资更好的设备,如MIG焊机设备,或对员工进行更好的培训.然而,使用大数据,制造商可以使用计算机程序来优化流程,并更加巧妙地分析错误,从而防止这些错误产生. 2.产量更高.大多数制造商购买原材料并制造

Sql实现行列转换方便了我们存储数据和呈现数据_mssql2005

从MS Sql Server 2005微软就推出了pivot和unpivot实现行列转换,这极大的方便了我们存储数据和呈现数据.今天就对这两个关键字进行分析,结合实例讲解如何存储数据,如何呈现数据. 例如学生选课和成绩系统中就有一张表,该表存储了学生的课程成绩,我们无法去预料课程的多少,因此一般表会设计为下面这样: 图1  最后一列是课程编号,这样无论开学之后还会不会增加课程供学生选择,都没有关系.那么我们要呈现给用户看的报表一般是这样的: 图2  可以看到存储数据的时候采用的是列式存储,最终呈

风控GPS平台-停留数据如何呈现个性化

以下的案列是从红将军GPS厂家旗下的5号风控平台作为一个演示的,这个演示是目前系统当中最完善,基于昨晚更新的报表数据. 那停留数据该如何的去操作的呢? 在很多平台把停留的数据做成了单个设备,或者是直接显示当前停留的,而这些细节上的问题,大多数企业还是看到的是表面. 如果需要仔细的去分析,看到的还是非常的少. 如www.honggps.com下面的停留报表数据 多样化报表 总账号可以看到子账号的一些报表. 这点在很多平台所做不到的. 这个停留数据可以这样的. 每天停留数据 还可以这样的 还可以这样

获得数据库连接池中数据连接资源的两种方式

相比于从数据库中直接获取数据库连接,使用数据库连接池的方式可以很大程度的提高数据库连接的效率.因此我们在实际开发中通常会采用数据库连接池的方式获取数据库的连接,在使用完成后这些资源再返还给数据库连接池.下面我们就来看一看常用的数据库连接池的简单的方法. 使用DBCP方式 话不多说,直接上代码.这里仅仅是一个简单的效果呈现,所以只需要打印出一句话即可. package jdbcpool; import java.sql.Connection; import org.apache.commons.d

ASP.NET中用哪种方式表格化数据

asp.net|数据    在开发ASP.NET站点项目中,经常用表格化的方式显示数据.最常用的可能就是DataGrid绑定DataSet数据的方式.在做过的软件项目中,有3种表格化数据的典型处理方式.    1.DataGrid绑定数据源.这种方式大家用的最多,但是DataGrid与ADO.NET完美的绑定方式,还是让人不爽.清一色的DataGrid风格很难适应不同项目的特殊风格,而且在DataGrid上做出的个性化处理也会非常的麻烦.    2.用XML(数据)+XSL(样式单).大家能理解

不用递归实现树形结构的一种方法

递归 不用递归实现树形结构的一种方法 主要的技巧在Level(帖子回复深度)的操作上 SunADM 于 2000.07.26____________________________________________演示表的结构____________________________________________ 表名:BBS 字段数据类型说明ID自动编号 RootIDInt根帖ID,本身为根帖则RootID = IDFIDInt父帖ID,上一层帖子的ID,如是根帖则FID = NULLLevel

数据拦截-【网络数据包拦截】有没有一种函数或者库可以将网络的数据包拦截下来?是拦截不是复制。

问题描述 [网络数据包拦截]有没有一种函数或者库可以将网络的数据包拦截下来?是拦截不是复制. 如题,我想拦截网络的数据包并且对数据包进行修改再发回,并且创造新的数据包, 有这种方法吗?谢谢大家~ 解决方案 正常情况下, 都是使用 HOOK 来实现, 好象有一个 WIN HOOK API 的库. 可以找一下. 解决方案二: 可以使用WPE.具体的可以参见http://baike.baidu.com/link?url=XETpG4nydfqe8k9wnOedeDceV8jzYqs1F61wMb4x8