数据共享和数据传递

数据共享和数据传递是相辅相成的,我们一起来讨论这个问题。首先要说的是共享和传递都是有作用域的。作用域就是起作用的区域,在同一个作用域数据可以共享,超过这个作用域就是跨作用域,就得用到数据传递了。

作用域

  1. ui作用域
    每一个ui文件缺省都有对应的ui.js。他们作为一个闭合的作用域。ui.js里根据ui文件里组件的id来获取ui对象;不同的ui文件可以定义相同id的组件。在ui.js里定义的变量只能在这个js里访问。
  2. page作用域
    每次调用openPage都会打开一个新的page,这个新的page会盖在旧的page之上,closePage关闭自己后就会露出被盖住的旧的page。每一个page里除了主ui文件以外,还可以包含其它很多ui文件,这些ui文件在同一个page作用域。
    当page关闭的时候,所有在page里构建的对象都会释放。
  3. app作用域
    这个是最大的作用域,只要app没有退出,这个作用域就一直有效。

    app.js属于app作用域,因为它不属于任何page。

总之,app作用域包含多个page作用域,page作用域包含多个ui作用域。

内存共享

相对文件和数据库,内存操作的速度快很多,适合于比较少的数据量操作。缺点就是app关闭后就释放了。deviceone通过以下几种方式来共享内存。

1. do_Global的memory操作(app作用域)

这个是app作用域的数据分享。这一块内存其实就是一个键值对,一个key对应一个value,所以要注意如果对一个key重新赋值,就会把以前的value覆盖。使用方法很简单。参考以下的示例,读和写分别在不同的page。

//在index.ui.js里设置值,可以设置为任何json对象,函数对象例外。
    global.setMemory("key1", 1);
    global.setMemory("key2", "value1");
    global.setMemory("key3", [ "a", "b", "c" ]);
    global.setMemory("key4", {
        "k1" : "v1",
        "k2" : "v2",
        "k3" : "v3",
        "k4" : "v4"
    });
var label = ui("do_Label_2");
// 在memory/index.ui.js里获取值,可直接返回json对象
var global = sm("do_Global");
var content = {};
content.key1 = global.getMemory("key1");
content.key2 = global.getMemory("key2");
content.key3_2 = global.getMemory("key3")[1];
content.key4_k3 = global.getMemory("key4")["k3"];
label.text = JSON.stringify(content, null, 2);// 格式化

2. Javascript的全局变量(page作用域)

利用JavaScript自身的特性定义全局变量,通常可以定义全局变量来实现同一page下不同ui文件里的数据分享。参考以下的示例,读和写分别在不同的ui文件,但是是在一个page作用域。使用也非常简单,有二种方式:

虽然很方便,但并不推荐使用,因为使用太随意,如果是协作开发或复杂的项目,如果碰见bug,很难定位和调试。

// 在test1.ui.js里设置js的全局变量,二种方式。
// 1.不要加var前缀的变量定义,
key1 = "value1";
// 2. 把全局变量定义在deviceone对象上
deviceone.key2 = {
    "k1" : "v1",
    "k2" : "v2",
    "k3" : "v3",
    "k4" : "v4"
}
// 在test2.ui.js里获取test1.ui.js里定义的全局变量,二种方式。
var content = {};
content.key1 = key1;
content.key2_k3 = deviceone.key2["k3"];

3. Javascript的变量(ui作用域)

这个不用太多解释,就是正常的js变量定义,只能在当前ui.js作用域有效。

var key1 = "value1";

4. sqlite的内存模式

sqlite通常是文件模式,有一种特殊的情况可以直接在内存里使用sqlite,适用于数据结构比较复杂,文本操作麻烦的方式,利用sql语句操作会灵活得多。
内存模式只能有一个,名字固定为\:memory\:.
在后面sqlite数据库介绍的地方再详细介绍。

文件共享

这个大家很好理解,文件共享是app作用域的,而且app重启后也可以访问。可以通过do_Storage组件在app的任何地方把内容写入一个文件,然后在另外一个地方读一个文件把内容读出来。参考以下的示例,读和写分别在不同的page。这里要注意的是文件读写通常是异步的,你得确保内容已经写完了,然后才能读.

// 在index.ui.js里写文件file1和file2,可以直接写json对象
    var key1 = "value1";
    storage.writeFile("data://file1", key1, function(data, e) {
        // 回调到这里才真正把内容写完,如果在执行到这里之前去读文件有可能读不到数据
    })
    var key2 = {
        "k1" : "v1",
        "k2" : "v2",
        "k3" : "v3",
        "k4" : "v4"
    };
    storage.writeFile("data://file2", key2, function(data, e) {
        // 回调到这里才真正把内容写完,如果在执行到这里之前去读文件有可能读不到数据
    })
// 在datacache/index.ui.js里获取值,可直接返回json对象
var datacache = sm("do_DataCache");
var content = {};
content.key1 = datacache.loadData("key1");
content.key2_3 = datacache.loadData("key2")["k3"];
label.text = "datacache/index.ui.js里获取值,可直接返回json对象 \n"
        + JSON.stringify(content, null, 2);// 格式化

do_SQLite组件访问数据库数据

这个组件是一个MM组件,意味着可以创建多个实例。所有MM组件都缺省是page作用域,也可以是app作用域。创建MM组件第三个参数标示作用域。

这里要注意的是SQLite读写通常是异步的,你得确保内容已经写完了,然后才能读

1. app作用域:

// 创建一个app作用域的sqlite对象,第二个参数是这个对象的标示,第三个参数标示作用域是app
var sqlite_app = mm("do_SQLite", "sqlite_app_id1", "app")
function test_sqlite() {
    // 在index.ui.js里利用这个对象创建一个数据库test.db
    sqlite_app.open("data://test.db");
    var stu_table = "drop table if exists stu_table"
    // 同步执行一个SQL语句
    sqlite_app.executeSync(stu_table);
    // 创建表SQL语句
    stu_table = "create table stu_table(_id integer primary key autoincrement,sname text,snumber text)";
    // 同步执行一个SQL语句
    sqlite_app.executeSync(stu_table);
    var stu_sql = "insert into stu_table(sname,snumber) values(‘xiaoming‘,‘01005‘);"
            + "insert into stu_table(sname,snumber) values(‘xiaohong‘,‘01006‘);"
            + "insert into stu_table(sname,snumber) values(‘xiaoliu‘,‘01007‘)";
    // 异步执行一个SQL语句
    sqlite_app.execute(stu_sql, function(data, e) {
        // 回调到这里才真正把数据插入完,如果在执行到这里之前去查询数据有可能读不到数据
        deviceone.print("insert finished!")
    })
// 根据"sqlite_app_id1"这个id获取一个app作用域的sqlite对象,第二个参数是这个对象的标示,第三个参数标示作用域是app
var sqlite_app = mm("do_SQLite", "sqlite_app_id1", "app")
// 在sqlite/index.ui.js里利用这个对象查询test.db,因为这个对象已经打开了数据库,所以不需要再open了
// 创建查询SQL语句
var stu_query = "select * from stu_table";
// 同步执行一个查询语句
var result = sqlite_app.querySync(stu_query);
label.text = "在sqlite/index.ui.js里利用这个对象查询test.db里的stu_table表的第二条数据\n"
        + JSON.stringify(result[1], null, 2);

2. page作用域:

// 创建一个page作用域的sqlite对象,唯一的id标示是memory_db_id1
var sqlite_app = mm("do_SQLite", "memory_db_id1", "page");
// 在test1.ui.js里利用这个对象创建一个内存数据库,这个名字必须写死是:memory:
sqlite_app.open(":memory:");
// 创建表SQL语句
var stu_table = "drop table if exists stu_table;"
// 内存数据库执行速度快,可以尝试都用同步
// 同步执行一个SQL语句
sqlite_app.executeSync(stu_table);
stu_table = "create table stu_table(_id integer primary key autoincrement,sname text,snumber text)";
// 同步执行一个SQL语句
sqlite_app.executeSync(stu_table);
var stu_sql = "insert into stu_table(sname,snumber) values(‘laoming‘,‘1‘);"
        + "insert into stu_table(sname,snumber) values(‘laohong‘,‘2‘);"
        + "insert into stu_table(sname,snumber) values(‘laoliu‘,‘3‘)";
// 同步执行一个SQL语句
sqlite_app.executeSync(stu_sql);
// 在test2.ui.js里查询在test1.ui.js里创建的数据库表
// 根据memory_db_id1这个标示来获取已经创建好的sqlite对象
var sqlite_app = mm("do_SQLite", "memory_db_id1", "page");
// 创建查询SQL语句
var stu_query = "select * from stu_table";
// 同步执行一个查询语句
var result = sqlite_app.querySync(stu_query);
label.text = "在test2.ui.js里查询在test1.ui.js里创建的内存数据库表的第三条记录\n"
        + JSON.stringify(result[2], null, 2)

数据传递

数据传递涉及到跨作用域,比如不同的ui文件传递数据,不同的page传递数据。
其中最重要也是最常用的方式就是消息机制

    1. 消息机制
      这个环节我们在文档再里详细介绍。
      总之,消息机制可以在跨ui作用域传递数据,也可以跨page作用域传递数据。
    2. openPage和closePage传递数据。
      这个数据传递是跨page作用域,但是只限于相隔二层page之间。比如在page1的基础上打开page2,page1把一些数据传递给page2;page2关闭自身,露出page1,又可以把数据传递回page1. 数据传递可以是任何json对象。
      这是一个常规而且非常好的方式,建议都这么使用。
// 在index.ui.js里openPage页面open_close_page/index.ui,传递数据
    var d = {
        "k1" : "v1",
        "k2" : "v2",
        "k3" : "v3",
        "k4" : "v4"
    };
    app.openPage({
        source : "source://view/open_close_page/index.ui",
        data : d,
        statusBarState : "transparent"
    });
}
// 接受页面open_close_page/index.ui 关闭的时候传递回来的数据
page.on("result", function(data) {
    if (data)
        nf.alert(JSON.stringify(data, null, 2));
})
// 从index.ui.js传递过来的数据通过getData获取值,可直接返回json对象
var data = page.getData();
label.text = "从index.ui.js传递过来的数据通过getData获取值,可直接返回json对象 \n"
        + JSON.stringify(data, null, 2);// 格式化
function close_me() {
    // 关闭自身,把数据传递回下一层page
    app.closePage("我是从open_close_page/index.ui关闭的时候传递过来的数据");
}

整个文档的详细示例参考这里

				
时间: 2024-10-04 13:35:09

数据共享和数据传递的相关文章

Angular2 - 数据共享与数据传递 - 应用环境信息配置

在Angular项目的设计中,我们往往需要定义一些全局的数据,如:应用名称,版本,当前环境,后端服务器地址,当前用户信息等,并希望能一次定义,多处共享,这里我们介绍如何用service来为整个应用提供全局配置服务. (1) 应用环境 1. 定义名为App_Configuration的interface,该配置中,我们定义了应用的基本信息字段,开发环境和生产环境的参数类型 //App_Configuration..config.ts export interface App_Configurati

解析activity之间数据传递方法的详解

转自:http://www.jb51.net/article/37227.htm 本篇文章是对activity之间数据传递的方法进行了详细的分析介绍,需要的朋友参考下 1  基于消息的通信机制 Intent--------boudle,extra用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等详细介绍下Intent机制Intent包含两部分:1 目的[action]-------要去到哪里去2 内容[category.data]----------路上带些什么,

activity之间的数据传递方法

1  基于消息的通信机制 Intent--------boudle,extra 用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等 详细介绍下Intent机制 Intent包含两部分: 1 目的[action]-------要去到哪里去 2 内容[category.data]----------路上带些什么,区分性数据和内容性数据 简单数据传递: Intent intent = new Intent(LoginActivity.this, MainActivity

剖析 Rails 3 MVC 中的数据传递

本文分析了 Rails 3 的 MVC 架构,探讨总结了 Rails 3 的控制器与视图.控制器与模型.视图与布局以及多个视图之间的数据传输方法和技巧.假设您对 Ruby on Rails 有基本的了解,至少能够配置 Ruby on Rails 并运行类似 Hello World 的入门应用程序. 0 评论: 林 洪祥, 软件工程师, IBM 2011 年 8 月 29 日 内容 在 IBM Bluemix 云平台上开发并部署您的下一个应用. 现在就开始免费试用 如果读者已经开发过基于 Rail

Express框架与html之间如何进行数据传递

关于Node.js 的Express框架介绍,推荐看菜鸟教程的Express框架,很适合入门,这里不再赘述,这里主要讲一下Express框架与html之间如何进行数据传递 我采用的是JQuery的Ajax()向后台传参方式 (url传参) 一.首先先讲一下jQuery的Ajax()向后台传参(参考http://blog.csdn.net/ailo555/article/details/48859425) 1.Type属性为Get时: (1)第一种方法:(通过url传参) function Get

propsData 选项 全局扩展的数据传递

propsData 不是和属性有关,他用在全局扩展时进行传递数据,结合自定义属性获取属性值的props一起使用 html <div id="app"> <register></register> </div> js var regi = Vue.extend({ template:`<div><h2>{{message}}--{{a}}</h2></div>`, data:function(

Android(java)学习笔记220:开发一个多界面的应用程序之界面间数据传递

1.界面跳转的数据传递 (1)intent.setData() --> intent.getData():     传递的数据比较简单,一般是文本类型的数据String:倘若我们传递的数据比较复杂(几种类型),或者比较长,这个方法就不怎么实用了. (2)如果有很多的不同类型的数据传递 intent.putExtra(key, value): • 基本类型的数据都可以传递,基本类型数据的数组也可以传递 • 对象必须是实现序列化接口的对象.Bitmap • 传递一组数据:          放数据:

Android页面跳转和数据传递

Android应用开发-页面跳转和数据传递 Activity Android四大组件之一 可以理解为Android中的界面,每一个界面都是一个Activity Activity的使用必须在清单文件中进行配置 在清单文件中, 创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-filter> <action android:name="android.intent.action.M

无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"