smartjs - DataManager 场景示例分析 - 数据懒加载

发一张policy的参数图设置图:

场景1 - 数据的懒加载/延迟加载

在很多时候,为了提高网页的加载速度,减少不必要的开销,会将页面的数据拆分成几个部分,首先加载呈现可视区域内的数据,然后剩下来的会在需要的时候在进行加载。

而这种按需加载的数据又分为两种:

  1.按照需要进行加载;可以是由某个动作触发来引起,比如:tab,查看更多等;

  2.采用缓存的方式;对后续动作的预知,提前将后续的数据加载进来,放入到缓存中;等需要的时候能提供快速的响应;比如:很多igrid的滚动分页

那么来看一下在dataManager如何快速简单的完成这两种方式,首先以一个用户信息关联项目为的例子:

//服务端的user数据转成前端model数据
var userData = {
    id: 1,
    name: "user1",
    age: 20,
    role: "tester",
    //关联projectid
    projectId: 1
}
//项目数据的model数据
var projectData = {
    id: 1
    name: "smartjs",
    ver: "0.3"
}

第一种按需加载方式:

//创建一个object的对象
var user = dataManager.create("object", {
    //设置主键字段
    key : "id",
    //get动作的策略
    get: {
        //定义数据服务
        dataServices: {
            //ajax数据服务
            dsType: "ajax",
            //默认的请求url地址;根据id查询
            url: "services/user/{id}",
            //field规则映射
            fieldMapping: {
                //project的查询地址
                project: "services/project/{projectId}"
            }
        }
    }
})

//首先通过id=1的条件,查询user
user.get({
    //设置查询参数,默认匹配key字段
    params : 1,
    //执行成功,数据填充到dm,并执行成功方法
    success : function(result){
        //进行数据渲染
        renderUser(result);
    }
})

//当需要查询项目信息时
user.get({
    //查询的字段;dm会根据field匹配到fieldMapping的ajax设置,从而拿到数据
    field : "project",
    //执行成功,数据填充到dm,并执行成功方法
    success : function(result){
        //进行数据渲染
        renderProject(result);
    }
})

使用了两个get的方法,第一个查询user信息,第二个查询project信息;project查询会根据field找到fieldMapping对于的配置,根据dm内部的数据格式化url参数,然后在发送请求

第二种缓存方式

如果采用缓存方式,预期在查询玩user后,想延迟2s在加载project信息,那么应该怎么做?答案是:使用dataManager的trigger

var user = dataManager.create("object", {
    //设置主键字段
    key: "id",
    //get动作的策略
    get: {
        //定义数据服务
        dataServices: {
            //ajax数据服务
            dsType: "ajax",
            //默认的请求url地址;根据id查询
            url: "services/user/{id}"
        },
        //定义触发器
        trigger: [{
            name: "get project",
            //延迟2s
            delay: 2000,
            field: "project",
            dataServices: {
                //ajax数据服务
                dsType: "ajax",
                //project的查询地址
                url: "services/project/{projectId}",
            },
            //触发器执行成功,数据填充到dm数据的project字段中,并执行成功方法
            success: function(result) {
                //进行数据渲染
                renderProject(result);
            }
        }]
    }
})
//首先通过id=1的条件,查询user
user.get({
    //设置查询参数,默认匹配key字段
    params: 1,
    //执行成功,数据填充到dm,并执行成功方法
    success: function(result) {
        //进行数据渲染
        renderUser(result);
    }
})

从例子中可以看到,不需要定义field的映射;而是通过设置trigger来完成;trigger会在get动作时触发(默认的策略为有从dataServices请求时触发);延迟2s发送ajax请求拿到数据,执行trigger的success

结尾

目前提供的都是一些伪代码,大家可以看下处理的思路;dataManager-object、table,tree和还有很多的dataService都还没完成;想这样使用的话,还得等一段时间。

现在贴出来也是想抛砖引玉,大家有比较好的场景也可以说一下,看dataManager能否支持。

不过dataManager的引擎已经完成了初步。有兴趣的同学可以自己根据引擎创建出适合自己使用的数据管理和数据服务。

当然等后面SmartJs功能完善后,使用会比例子中更加简单,而且功能也更加强大。

后面还会介绍 “数据自动同步”,“多数据服务通信”,“消息订阅”几个场景,对于使用的最多的table类型的数据就不多做介绍了,因为dataManager-table会在下一版中发布,到时会有很多丰富的例子。

smartjs - DataManager 场景示例分析 - 数据懒加载,布布扣,bubuko.com

时间: 2024-08-01 22:41:54

smartjs - DataManager 场景示例分析 - 数据懒加载的相关文章

安卓中实现界面数据懒加载

大家在使用手机新闻客户端的时候就会有一个发现,大多数的新闻客户端都会把新闻分类,诸如头条.娱乐.体育.科技等等,如何实现这种界面的呢?这个实现起来其实很简单,就是在一个Fragment中实现多个ViewPage的切换,再在ViewPage的上面放一个TabLayout,关联起来就可以实现联动效果.如果大家感觉不太明了的话,以后我可以专门写一篇关于Fragment中放入多个ViewPage的博客,今天,我主要介绍的是怎样实现界面即Fragment的懒加载.那么,大家就会奇怪了既然是加载界面直接加载

IOS数据懒加载

懒加载,又称为延迟加载.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载资源,只有在运行当需要一些资源时,再去加载这些资源. 我们知道iOS设备的内存有限,如果在程序在启动后就一次性加载将来会用到的所有资源,那么就有可能会耗尽iOS设备的内存.这些资源例如大量数据,图片,音频等等 下面举个例子: 1> 定义控件属性,注意:属性必须是strong的,示例代码如下: @property (nonatomic, strong) NSArray *imageList; 2>

数据懒加载

1.判断数据集是否为空,如果为空加载数据,否则不需要加载数据. -(NSArray *)roles { if (_roles == nil) { //获取数据文件 NSString *path = [[NSBundle mainBundle]pathForResource:@"heros.plist" ofType:nil]; NSArray *array = [NSArray arrayWithContentsOfFile:path]; NSMutableArray *mutable

Android - Fragment正确使用方法介绍,setUserVisibleHint方法实现数据懒加载

我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源.这样的结果,我们当然不会满意.那么,能不能做到当切换到这个fragment的时候,它才去初始化呢? 答案就在Fragment里的setUserVisibleHint这个方法里. import android.support.v4.app.Fr

小程序云开发数据懒加载

一些页面需要的数据可能更多一些,诸如动态页面,新闻页面等.一次加载太多数据对于用户而言是极为不好的体验. db.collection("dynamic").orderBy("createTime", "desc").skip(pages).limit(5).get().then().catch() pages为起点,limit里面的5则为每次调取几条数据.因此可以在 onReachBottom里面进行调用,首先在page()外面let 声明pag

VUE 实现监听滚动事件,实现数据懒加载

methods: { // 获取滚动条当前的位置 getScrollTop() { let scrollTop = 0 if (document.documentElement && document.documentElement.scrollTop) { scrollTop = document.documentElement.scrollTop } else if (document.body) { scrollTop = document.body.scrollTop } retu

深入懒加载

[javascript] view plain copy 懒加载(LazyLoad)一直是前端的优化方案之一.它的核心思想是:当用户想看页面某个区域时,再加载该区域的数据.这在一定程度上减轻了服务器端的压力,也加快了页面的呈现速度. 懒加载多用于图片,因为它属于流量的大头.最典型的懒加载实现方案是先将需要懒加载的图片的src隐藏掉,这样图片就不会下载,然后在图片需要呈现给用户时再加上src属性. 公司内部库的懒加载正是采用这种方案.它会遍历页面中所有的图片,将其src缓存起来后删除图片的src属

hibernate懒加载(转载)

http://blog.csdn.net/sanjy523892105/article/details/7071139 懒加载详解 懒加载为Hibernate中比较常用的特性之一,下面我们详细来了解下懒加载的原理和注意事项 Load()方法的懒加载原理 在Hibernate中,查询方法有两个,分别是get()和load(),这两种方法的不同就是load()拥有懒加载的特性.Load()方法就是在查询某一条数据的时候并不会直接将这条数据以指定对象的形式来返回,而是在你真正需要使用该对象里面的一些属

实现图片懒加载

Web 图片的懒加载就是通过读取img元素,然后获得img元素的data-src(也可以约定为其他属性名)属性的值,并赋予img的src,从而实现动态加载图片的机制. 这里需要注意的是: img在初始化的时候不要设置src属性,因为即使设置 src='' 浏览器也会尝试加载图片. 一个简单的图片懒加载共涉及两个方面, 1. HTML 约定 我们首先需要给准备实施懒加载的img元素添加指定的class 这里为m-lazyload ,同时将img src赋值给 data-src属性.具体示例为: <