數據共用和數據傳遞

来源:http://www.cnblogs.com/andbut/archive/2016/04/25/5429261.html
-Advertisement-
Play Games

數據共用和數據傳遞是相輔相成的,我們一起來討論這個問題。首先要說的是共用和傳遞都是有作用域的。作用域就是起作用的區域,在同一個作用域數據可以共用,超過這個作用域就是跨作用域,就得用到數據傳遞了。 作用域 ui作用域每一個ui文件預設都有對應的ui.js。他們作為一個閉合的作用域。ui.js里根據ui ...


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

作用域

  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關閉的時候傳遞過來的數據");
}

整個文檔的詳細示例參考這裡


 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • //參數為消息提示層對應的對象,通常為表單里的對象 //特別註意:當使用擴展方法里的type=radio或者type=checkbox時,因為當時設置消息提示層的對象為obj.parentElement.parentElement,所以傳入的對象也應為其上2級父節點 function hiddenM ...
  • CSS3作為新興的前端技術可以實現很多複雜變化的效果,比如文字描邊。 這裡主要用到text-shadow屬性,顧名思義就是為文字加上陰影效果。例: 其中:x位移和y位移表示陰影相對文字的偏移值,可以為負值。 思路其實很簡單:對四個方向都作出模糊程度為零的1px陰影。 原則上,text-shadow支 ...
  • 第七章是入門篇的倒數第二篇文章了,明天整個APP將進入收官。 本節教程主要要教會大家使用二維碼掃描和用do_WebView組件加在html頁面。 導入項目 do_WebView組件 掃描功能 自定義事件 將要學習的demo效果圖如下所示 1. 導入完整項目 本節示例demo請參考下載地址,可以導入到 ...
  • 隨著高端手機(Andriod,Iphone,Ipod,WinPhone等)的盛行,移動互聯應用開發也越來越受到人們的重視,用html5開發移動應用是最好的選擇。然而,每一款手機有不同的解析度,不同屏幕大小,如何使我們開發出來的應用或頁面大小能適合各種高端手機使用呢?學習html5 viewport的 ...
  • 協議 WebSocket是一種基於TCP之上的客戶端與伺服器全雙工通訊的協議,它在HTML5中被定義,也是新一代webapp的基礎規範之一。 它突破了早先的AJAX的限制,關鍵在於實時性,伺服器可以主動推送內容 到客戶端!可能的應用有:多人線上游戲,即時聊天,實時監控,遠程桌面,新聞伺服器等等。 對 ...
  • 最近在項目中使用jQuery.query.js這個插件進行頁面間URL傳值,遇到如下兩點問題: 1. 參數中存在空格時取到的值中空格被替換為加號:+ 2. 當參數某個key的value不存在時,獲取到的value並不是空/null 而是true。 在網上找到了個解決方案,可以參考下(是否有其他副作用 ...
  • 一、顯示信息的命令 console.log(); //控制台輸入 網頁中不會輸出 console.info(); //一般信息 console.debug(); //除錯信息 console.warn(); //警告提示 console.error(); //錯誤提示 “console.log(); ...
  • 註冊頁面是大多數網站必備的頁面,所以很有必要對自己的註冊頁面做些精心的設計。下麵三張圖,第一張是註冊的展示頁面,第二張思維導圖就一個簡單的邏輯,第三張是通過firebug查看調用的JS文件。 註冊的展示頁面 簡單的邏輯 通過firebug查看調用的JS文件 一、給每個輸入框寫下說明 在用戶看到這個輸 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...