AppWorker教程-數(shù)據(jù)綁定

數(shù)據(jù)綁定

數(shù)據(jù)綁定是在應(yīng)用程序 UI 與數(shù)據(jù)源建立連接的過(guò)程规伐。如果綁定正確數(shù)據(jù),則當(dāng)數(shù)據(jù)更改其值時(shí)枚荣,綁定到數(shù)據(jù)的UI屬性值會(huì)自動(dòng)反映更改灵再。AppWorker支持靈活的數(shù)據(jù)綁定,使UI展示和數(shù)據(jù)可以清晰的分離奴艾。目前還不支持雙向綁定净当,只支持?jǐn)?shù)據(jù)到展示的傳遞。
使用AppWorker開(kāi)發(fā)App蕴潦,你可以不使用任何數(shù)據(jù)bind機(jī)制像啼,傳統(tǒng)的獲取對(duì)象,給對(duì)象每一個(gè)單個(gè)屬性設(shè)置值也可以實(shí)現(xiàn)所有功能潭苞。但是使用bind機(jī)制可以減少代碼埋合,優(yōu)化框架,使開(kāi)發(fā)工作事半功倍萄传。

1.基本綁定方式:

bind包括源和目標(biāo)甚颂,AppWorker的bind目標(biāo)通常指UI組件,所有的UI組件都支持基本的bind方式秀菱。實(shí)際上只要一個(gè)組件有屬性就可以支持bind振诬,比如UI和MM(MultitonModule)組件都有屬性,都支持bind衍菱。

bind的源我們目前提供了2個(gè)組件do_ListDatado_HashData分別表示二種數(shù)據(jù)結(jié)構(gòu)赶么,hash和array,因?yàn)檎麄€(gè)AppWorker的數(shù)據(jù)基礎(chǔ)都是json格式脊串,所以這2個(gè)數(shù)據(jù)組件都是只能處理json格式辫呻。
UI和MM類的基類都提供了3個(gè)相關(guān)的方法來(lái)實(shí)現(xiàn)bind機(jī)制。

  • setMapping方法:設(shè)置一個(gè)UI組件或者M(jìn)M組件的屬性和數(shù)據(jù)的映射關(guān)系琼锋。
  • bindData方法:設(shè)置UI組件或者M(jìn)M組件的數(shù)據(jù)源放闺,這個(gè)數(shù)據(jù)源目前只能是do_ListDatado_HashData.
  • refreshData方法:當(dāng)bind的數(shù)據(jù)源數(shù)據(jù)發(fā)生變化后,調(diào)用這個(gè)方法來(lái)刷新數(shù)據(jù)源的展示缕坎。
    示例如下:
function test1() {
        // 創(chuàng)建一個(gè)HashData對(duì)象
        var data = mm("do_HashData");
        // 給Button創(chuàng)建一個(gè)屬性到數(shù)據(jù)的映射,其中text和bgColor是Button的2個(gè)屬性
        btn1.setMapping({
                "text" : "text_key",
                "bgColor" : "color_key"
        });
        // 建立Button和HashData的綁定
        btn1.bindData(data);
        // 數(shù)據(jù)變化驅(qū)動(dòng)UI屬性變化
        // 1. 修改數(shù)據(jù)
        data.addData({
                "text_key" : "映射到HashData",
                "color_key" : "FF0022AA"
        });
        // 2. 刷新UI,這個(gè)按鈕的文本變成“映射到HashData”怖侦,背景顏色變?yōu)椤癋F0022AA"
        btn1.refreshData();
}

其中一個(gè)UI的映射可以作為bindData的一個(gè)參數(shù),比如

function test2() {
        // 創(chuàng)建一個(gè)HashData對(duì)象
        var data = mm("do_HashData");
        // 建立Button和HashData的綁定,同時(shí)設(shè)置映射關(guān)系
        btn2.bindData(data, {
                "text" : "text_key",
                "bgColor" : "color_key"
        });
        // 數(shù)據(jù)變化驅(qū)動(dòng)UI屬性變化
        // 1. 修改數(shù)據(jù)
        data.addData({
                "text_key" : "映射到HashData-直接設(shè)置映射",
                "color_key" : "FFCC00AA"
        });
        // 2. 刷新UI,這個(gè)按鈕的文本變成“映射到HashData-直接設(shè)置映射”谜叹,背景顏色變?yōu)椤癋FCC00AA"
        btn2.refreshData();
}
// ...

其中HashData對(duì)象支持path匾寝,中間用.號(hào)來(lái)隔開(kāi),比如

function test3() {
        // 創(chuàng)建一個(gè)HashData對(duì)象
        var data = mm("do_HashData");
        // 給Button創(chuàng)建一個(gè)屬性到數(shù)據(jù)的映射,其中text和bgColor是Button的2個(gè)屬性
        // HashData對(duì)象支持path荷腊,中間用.號(hào)來(lái)隔開(kāi)
        btn3.setMapping({
                "text" : "node1.text_key",
                "bgColor" : "node1.color_key"
        });
        // 建立Button和HashData的綁定
        btn3.bindData(data);
        // 數(shù)據(jù)變化驅(qū)動(dòng)UI屬性變化
        // 1. 修改數(shù)據(jù)
        data.addData({
                "node1" : {
                        "text_key" : "映射到HashData-支持path",
                        "color_key" : "F00FEEAA"
                },
                "node2" : "xxxx"
        });
        // 2. 刷新UI,這個(gè)按鈕的文本變成“映射到HashData-支持path”艳悔,背景顏色變?yōu)椤癋00FEEAA"
        btn3.refreshData();
}

其中數(shù)據(jù)源也支持ListData,中間用:加數(shù)字索引來(lái)表明是一個(gè)list的一個(gè)元素

function test4() {
        // 創(chuàng)建一個(gè)HashData對(duì)象
        var data = mm("do_HashData");
        // 給Button創(chuàng)建一個(gè)屬性到數(shù)據(jù)的映射,其中text和bgColor是Button的2個(gè)屬性
        // HashData對(duì)象支持json array,中間用:加數(shù)字索引來(lái)表明是一個(gè)array的一個(gè)元素
        btn4.setMapping({
                "text" : "node1:2.text_key",
                "bgColor" : "node1:2.color_key"
        });
        // 建立Button和HashData的綁定
        btn4.bindData(data);
        // 數(shù)據(jù)變化驅(qū)動(dòng)UI屬性變化
        // 1. 修改數(shù)據(jù)
        data.addData({
                "node1" : [ {
                        "text_key" : "我是Button1",
                        "color_key" : "FFFFEEAA"
                }, {
                        "text_key" : "我是Button2",
                        "color_key" : "FFFFEEBB"
                }, {
                        "text_key" : "映射到HashData-支持JSONArray",
                        "color_key" : "00FFEECC"
                } ],
                "node2" : "xxxx"
        });
        // 2. 刷新UI,這個(gè)按鈕的文本變成“映射到HashData-支持JSONArray”女仰,背景顏色變?yōu)椤?0FFEECC"
        btn4.refreshData();
}

function test5() {
        // 創(chuàng)建一個(gè)ListData對(duì)象
        var data = mm("do_ListData");
        // 給Button創(chuàng)建一個(gè)屬性到數(shù)據(jù)的映射,其中text和bgColor是Button的2個(gè)屬性
        // do_ListData對(duì)象支持:加數(shù)字索引來(lái)表明是一個(gè)array的一個(gè)元素
        btn5.setMapping({
                "text" : ":2.text_key",
                "bgColor" : ":2.color_key"
        });
        // 建立Button和HashData的綁定
        btn5.bindData(data);
        // 數(shù)據(jù)變化驅(qū)動(dòng)UI屬性變化
        // 1. 修改數(shù)據(jù)
        data.addData([ {
                "text_key" : "我是Button1",
                "color_key" : "FFFFEEAA"
        }, {
                "text_key" : "我是Button2",
                "color_key" : "FFFFEEBB"
        }, {
                "text_key" : "映射到ListData",
                "color_key" : "0FF11ECC"
        } ]);
        // 2. 刷新UI,這個(gè)按鈕的文本變成“映射到HashData-支持JSONArray”猜年,背景顏色變?yōu)椤?0F11ECC"
        btn5.refreshData();
}

其中bind目標(biāo)UI也支持path香府,中間用.隔開(kāi),只不過(guò)有一個(gè)限制就是這個(gè)時(shí)候的綁定目標(biāo)UI必須是這個(gè)ui文件的根節(jié)點(diǎn)码倦。這種情況應(yīng)用更靈活方便企孩,不需要為每一個(gè)UI創(chuàng)建一個(gè)映射和一個(gè)數(shù)據(jù)源,這個(gè)ui文件里所有UI組件可以共用一個(gè)映射和數(shù)據(jù)源袁稽。比如

function test6() {
        // 根據(jù)統(tǒng)配符$來(lái)獲取ui文件的根節(jié)點(diǎn)勿璃,也可以根據(jù)它的ID獲取對(duì)象
        var rootview = ui("$");
        // 創(chuàng)建一個(gè)HashData對(duì)象
        var data = mm("do_HashData");
        // 給rootview創(chuàng)建多個(gè)子UI的屬性到數(shù)據(jù)的映射,其中button_id1.text和label_id1.text
        // 分別表示這個(gè)ui文件里一個(gè)id為button_id1的Button組件和id為label_id1的Label組件
        rootview.setMapping({
                "do_Button_6.text" : "node1.text_key",
                "do_Button_7.text" : "node2",
                "do_Button_6.bgColor" : "node1.color_key",
                "do_Button_7.bgColor" : "node3"
        });
        // 建立Button和HashData的綁定
        rootview.bindData(data);
        // 數(shù)據(jù)變化驅(qū)動(dòng)UI屬性變化
        // 1. 修改數(shù)據(jù)
        data.addData({
                "node1" : {
                        "text_key" : "多個(gè)子UI綁定1",
                        "color_key" : "1FFFE1BB"
                },
                "node2" : "多個(gè)子UI綁定2",
                "node3" : "1111FFBB"
        });
        // 2. 刷新UI,二個(gè)按鈕的文本變成“多個(gè)子UI綁定1,2”推汽,背景顏色變?yōu)椤?F1F1EBB补疑,11111EBB"
        rootview.refreshData();
}

2.特殊綁定方式:

這種bind機(jī)制不是所有UI組件都具有的,只有類似ListView歹撒,GridView等組件才有莲组,這種組件的共性在于用戶看到的視圖是有限的,但是實(shí)際上通過(guò)手勢(shì)滑動(dòng)可以有很多個(gè)數(shù)量不定的視圖暖夭。這種bind有以下幾個(gè)概念:

  • templates:模板是這種類型組件的一個(gè)屬性,里面包含的是ui文件名锹杈。不管這種View有多少個(gè)子視圖,但是模板數(shù)量是固定的迈着,比如大部分ListView有很多個(gè)單元竭望,但是這些單元都是共用一個(gè)或幾個(gè)模板,只不過(guò)每一個(gè)單元對(duì)應(yīng)的數(shù)據(jù)不一樣裕菠。
  • bindItems:這個(gè)是這種類型組件的一個(gè)方法咬清,這個(gè)方法的參數(shù)只能是do_ListData,表明這個(gè)視圖和一個(gè)list數(shù)據(jù)結(jié)構(gòu)的數(shù)組對(duì)象綁定在一起。
  • refreshItems:類似UI基類的refreshData方法奴潘,這個(gè)方法是這種類型組件的一個(gè)方法旧烧。當(dāng)bind的ListData發(fā)生變化后,通過(guò)這個(gè)方法來(lái)刷新界面画髓。

以下是一個(gè)ListView的示例代碼掘剪,這里面的代碼實(shí)際上是寫(xiě)在不同的2個(gè)ui文件對(duì)應(yīng)的ui.js文件里,比如ListView所在的文件叫listview_sample.ui.js

// listview_sample.ui.js文件
// 建立綁定.....
// 1. 根據(jù)ListView的ID獲取一個(gè)ListView的對(duì)象
var listview = ui("listview_id1");
// 2. 設(shè)置ListView的模板,這里只設(shè)置了一個(gè)模板文件雀扶,其實(shí)有可能有多個(gè)杖小。
//這個(gè)示例中,假設(shè)這個(gè)模板文件里面只有一個(gè)id為button_id1的Button組件
//在ui文件里設(shè)置listview的templates屬性為"source://listview_cell.ui"
//也可能支持多模板比如templates屬性為"source://listview_cell1.ui,source://listview_cell2.ui"
// 3. 創(chuàng)建一個(gè)ListData對(duì)象
var data = mm("do_ListData");
// 4. 建立ListView和ListData的綁定
listview.bindItems(data);

// 數(shù)據(jù)變化驅(qū)動(dòng)UI屬性變化
// 1. 修改數(shù)據(jù)
data.addData([{"text_key":"我是Button1","color_key":"#FFFFEEAA"},
              {"text_key":"我是Button2","color_key":"#FFFFEEBB"},
              {"text_key":"我是Button3","color_key":"#FFFFEECC"},
              {"text_key":"我是Button4","color_key":"#FFFFEEDD"},
              {"text_key":"我是Button5","color_key":"#FFFFEEEE"},
             ]);
// 2. 刷新UI,這個(gè)ListView會(huì)增加6個(gè)子視圖愚墓,每個(gè)視圖里的按鈕的文本變成“我是Button”+n,
//背景顏色變?yōu)椤癋FFFEE"+XX
listview.refreshItems();

以上的例子想要運(yùn)行成功昂勉,還需要在listview_cell.ui對(duì)應(yīng)的listview_cell.ui.js文件里添加以下類似代碼

//listview_cell.ui.js文件
// 建立綁定.....
// 1. 根據(jù)統(tǒng)配符$來(lái)獲取ui文件的根節(jié)點(diǎn)浪册,也可以根據(jù)它的ID獲取對(duì)象
var rootview = ui("$");
// 2. 給rootview創(chuàng)建子UI的屬性到數(shù)據(jù)的映射,其中button_id1.text和button_id1.bgColor
//表示這個(gè)ui文件里有一個(gè)id為button_id1的Button組件
rootview.setMapping({"button_id1.text":"text_key","button_id1.bgColor":"color_key"});
//注意這里不需要再單獨(dú)bind一個(gè)數(shù)據(jù)源了,這個(gè)文件作為listview的模板文件岗照,會(huì)自動(dòng)和listview綁定的數(shù)據(jù)建立bind關(guān)系村象。
//listview綁定的數(shù)組數(shù)據(jù)中每一項(xiàng)元素都是這個(gè)模板文件的數(shù)據(jù)源笆环。

ListView用的很廣,示例也非常多厚者,參考示例大全
注意:當(dāng)組件綁定多個(gè)模板時(shí)躁劣,數(shù)據(jù)內(nèi)需要多加一個(gè)key為“template”,指定單條數(shù)據(jù)綁定的模板索引库菲,默認(rèn)從0開(kāi)始

3.dataRefreshed 事件:

這個(gè)事件也很重要账忘,通常一個(gè)UI對(duì)象和一個(gè)Hashdata建立映射關(guān)系之后,當(dāng)hashdata更新數(shù)據(jù)后熙宇,UI對(duì)象調(diào)用refreshData或refreshItems后鳖擒,UI對(duì)象會(huì)接受到數(shù)據(jù),然后更新對(duì)應(yīng)的屬性值烫止,之后會(huì)觸發(fā)這個(gè)事件蒋荚。
這個(gè)事件會(huì)通常可以用在Listview馆蠕,Gridview期升,Slideview這種UI組件,它們都包含多個(gè)ui文件互躬,都有模板ui文件吓妆。通過(guò)這個(gè)事件可以實(shí)現(xiàn)主ui和模板ui的數(shù)據(jù)通訊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吨铸,一起剝皮案震驚了整個(gè)濱河市行拢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诞吱,老刑警劉巖舟奠,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異房维,居然都是意外死亡沼瘫,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)咙俩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)耿戚,“玉大人,你說(shuō)我怎么就攤上這事阿趁∧せ祝” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵脖阵,是天一觀的道長(zhǎng)皂股。 經(jīng)常有香客問(wèn)我,道長(zhǎng)命黔,這世上最難降的妖魔是什么呜呐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任就斤,我火速辦了婚禮,結(jié)果婚禮上蘑辑,老公的妹妹穿的比我還像新娘洋机。我一直安慰自己,他們只是感情好洋魂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布绷旗。 她就那樣靜靜地躺著,像睡著了一般忧设。 火紅的嫁衣襯著肌膚如雪刁标。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天址晕,我揣著相機(jī)與錄音膀懈,去河邊找鬼。 笑死谨垃,一個(gè)胖子當(dāng)著我的面吹牛启搂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刘陶,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胳赌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了匙隔?” 一聲冷哼從身側(cè)響起疑苫,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纷责,沒(méi)想到半個(gè)月后捍掺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡再膳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年挺勿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喂柒。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡不瓶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出灾杰,到底是詐尸還是另有隱情蚊丐,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布吭露,位于F島的核電站吠撮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏讲竿。R本人自食惡果不足惜泥兰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望题禀。 院中可真熱鬧鞋诗,春花似錦、人聲如沸迈嘹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秀仲。三九已至融痛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間神僵,已是汗流浹背雁刷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留保礼,地道東北人沛励。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像炮障,于是被迫代替她去往敵國(guó)和親目派。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,732評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理胁赢,服務(wù)發(fā)現(xiàn)企蹭,斷路器,智...
    卡卡羅2017閱讀 134,626評(píng)論 18 139
  • 1智末、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,969評(píng)論 3 119
  • 2018年1月1日谅摄,天氣晴。 我們?cè)谟彤?huà)村相遇和重逢吹害。 潘潘從福建來(lái)廣東參加傳統(tǒng)文化的學(xué)習(xí)螟凭,在大芬油畫(huà)村與她重逢。...
    雅_(tái)ef0e閱讀 399評(píng)論 2 3
  • 《迷霧》:開(kāi)掛的人生不需要解釋,做好自己就行 最近熱播的一部韓劇《迷霧Misty》可謂是刷爆了朋友圈纵穿,劇情緊...
    睿心Lady閱讀 670評(píng)論 -1 3