數據共用和數據傳遞

来源: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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...