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会在下一版中发布,到时会有很多丰富的例子。

 

 

转载于:https://www.cnblogs.com/zhh8077/p/3803203.html

使用Spotfire API重新加载数据可以通过以下步骤完成: 1. 首先,需要连接到Spotfire服务器。这可以通过使用API提供的TSServerConnection类来实现。例如: ```python from Spotfire.Dxp.Data import DataManager, DataColumnSignature from Spotfire.Dxp.Data.Import import TextFileDataSource from Spotfire.Dxp.Application import Application from Spotfire.Dxp.Framework.ApplicationModel import ApplicationThread from Spotfire.Dxp.Framework.Library import LibraryManager from Spotfire.Dxp.Framework.ApplicationModel import ApplicationThread from Spotfire.Dxp.Framework.DocumentModel import DocumentManager from Spotfire.Dxp.Data.Import import DataSourcePromptMode from Spotfire.Dxp.Data import DataFlowBuilder from Spotfire.Dxp.Data.Import import TextFileDataSourceSettings from Spotfire.Dxp.Data.Import import DataSourceTypeIdentifiers from Spotfire.Dxp.Data import RowSelection server = Application.GetServerConnection() ``` 2. 然后,需要打开要重新加载数据的文档。这可以通过使用API提供的DocumentManager和LibraryManager类来实现。例如: ```python libraryManager = LibraryManager(server) documentManager = DocumentManager(server) document = documentManager.OpenDocument("path/to/document") ``` 3. 然后,需要获取要重新加载数据数据表。这可以通过使用API提供的DataManager类来实现。例如: ```python dataManager = document.Data table = dataManager.Tables["table_name"] ``` 4. 然后,需要创建一个新的数据源,以便重新加载数据。这可以通过使用API提供的DataFlowBuilder和TextFileDataSourceSettings类来实现。例如: ```python dataSource = TextFileDataSourceSettings() dataSource.ColumnNamesLineIndex = 0 dataSource.DataStartingLineIndex = 1 dataSource.FieldSeparator = '\t' dataSource.HasHeaderRecord = True dataSource.IncludeFileShareCredentials = False dataSource.LocalFilePath = "path/to/file" dataFlowBuilder = DataFlowBuilder() dataFlowBuilder.AddImportDataSource("dataSourceName", DataSourceTypeIdentifiers.TextFile, dataSource) dataFlow = dataFlowBuilder.Build() newDataSource = dataFlow.DataSourceInfos["dataSourceName"].DataSource ``` 5. 最后,需要使用新的数据源重新加载数据。这可以通过使用API提供的DataManager和TextFileDataSource类来实现。例如: ```python textFileDataSource = TextFileDataSource(newDataSource, dataManager) textFileDataSource.ReplaceData(table, DataSourcePromptMode.Never) ``` 完成这些步骤后,数据表应该已经重新加载了新的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值