資料共用和資料傳遞

來源:互聯網
上載者:User

標籤:

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

範圍
  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.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對象,第二個參數是這個對象的標示,第三個參數標示範圍是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;"// 記憶體資料庫執行速度快,可以嘗試都用同步// 同步執行一個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關閉的時候傳遞過來的資料");}

整個文檔的詳細樣本參考這裡


 

 

資料共用和資料傳遞

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.