国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

深入淺析JavaScript中數據共享和數據傳遞

2019-11-20 10:13:28
字體:
來源:轉載
供稿:網友

數據共享和數據傳遞是相輔相成的,我們一起來討論這個問題。首先要說的是共享和傳遞都是有作用域的。作用域就是起作用的區域,在同一個作用域數據可以共享,超過這個作用域就是跨作用域,就得用到數據傳遞了。

作用域

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對象,第二個參數是這個對象的標示,第三個參數標示作用域是appvar sqlite_app = mm("do_SQLite", "sqlite_app_id1", "app")function test_sqlite() {// 在index.ui.js里利用這個對象創建一個數據庫test.dbsqlite_app.open("data://test.db");var stu_table = "drop table if exists stu_table"http:// 同步執行一個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對象,第二個參數是這個對象的標示,第三個參數標示作用域是appvar 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_id1var 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;"http:// 內存數據庫執行速度快,可以嘗試都用同步// 同步執行一個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() {// 關閉自身,把數據傳遞回下一層pageapp.closePage("我是從open_close_page/index.ui關閉的時候傳遞過來的數據");}

關于本文給大家介紹的js數據共享和數據傳遞的相關知識就給大家介紹這么多,希望對大家有所幫助!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 英吉沙县| 娱乐| 博爱县| 广西| 兴仁县| 蓝田县| 芜湖县| 双城市| 夏津县| 金山区| 灌云县| 社会| 保山市| 左云县| 高雄县| 韶山市| 保定市| 泰来县| 西充县| 高邮市| 洞口县| 葵青区| 德令哈市| 泽州县| 都匀市| 睢宁县| 石泉县| 辛集市| 筠连县| 秦安县| 五台县| 永嘉县| 共和县| 大同县| 普陀区| 抚顺市| 南充市| 永宁县| 灵台县| 延边| 虹口区|