DynamicDSL將遵循以下的交互展示邏輯: 描述文件(XML,Widget) --->(綁定數(shù)據(jù))--->渲染模板--->渲染--->事件驅(qū)動--->數(shù)據(jù)改變 這樣循環(huán)下來的,最終我們看到的就是App上的界面與交互效果了。
這看上去和RN,flutter有點像,只是我們這個是特定場景的使用。
實現(xiàn)了AST節(jié)點,已經(jīng)有了動態(tài)計算數(shù)據(jù)的能力,接下來我們將實現(xiàn)動態(tài)XML模板的綁定,為渲染前生成布局描述模板。
<View>
<View text="年齡: {{ 33.22 * 2}}" color="{{ item[age] >= 20 ? '#FFFFFF' : '#DDDDDD' }}" />
class="hljs-name"View>
這個模板比較簡單,它有一個根節(jié)點,根節(jié)點有一個子節(jié)點包含兩個屬性,我們用"{{ }}"來描述需要計算的表達式,如果沒有兩個大括號則認為是原始字符串。
「這里我們規(guī)定,布局模板必須在一個根節(jié)點下面!」
XML原始節(jié)點展示如下:
text節(jié)點可以直接計算出結(jié)果, color節(jié)點通過獲取環(huán)境變量中名稱為item的數(shù)據(jù),再進一步獲取其中名稱為age的數(shù)據(jù)與20進行比較,再得到具體的值。
R"({"item":{"age": 30}})"
動態(tài)綁定之后結(jié)果如下:

到此,可以認為這個XML是我們基礎(chǔ)布局模板,可以拿給Flex引擎計算了。
在組件布局的時候還時常需要對組件節(jié)點進行重復或者顯示與隱藏等操作,因此: 我們規(guī)定
for="{{for xx item xxs}}" 用于實現(xiàn)重復組件
if="{{ expr }}" 用于實現(xiàn)節(jié)點是否顯示
現(xiàn)在我們將XML的描述修改成下面這樣:
<View>
<View text="年齡: {{ 33.22 * 2}}" info="{{ item[name] }} : {{item[age]}}" color="{{ item[age] >= 20 ? '#FFFFFF' : '#DDDDDD' }}" for="{{ for item in items }}"/>
class="hljs-name"View>
XML原始節(jié)點展示如下:

首先我們需要遍歷節(jié)點的屬性,查找到節(jié)點中for字段的值是否為一個有效的循環(huán)表達式,然后對該循環(huán)表達式進行計算展開,結(jié)果如下:

R"({"item":{"age": 30},"items":[{"name": "小強", "age": 28},{"name": "小明", "age": 23},{"name": "小紅", "age": 18}]})"
**「這里需要特別注意的是:For會產(chǎn)生一個新的變量環(huán)境,for語句中定義了一個新的變量,當我們在展開時需要將新的變量(item)注入到變量環(huán)境中,item將覆蓋上一級環(huán)境變量中的item的值。
這與棧幀調(diào)用時的本地變量覆蓋上一級范圍中的變量是一樣的道理。
」** 展開之后,item是items中的每一個元素而不是根節(jié)點上的item了。
此時再對每個節(jié)點進行消解運算
注入的環(huán)境變量如下:

if語句相對簡單一點,它不會產(chǎn)生新的變量,只需要對表達式求值,獲取表達式的結(jié)果true則保留,false則刪除節(jié)點不展示。
測試一下,對一個相對復雜的模板進行動態(tài)綁定:
<View>
<View text="年齡: {{ 33.22 * 2}}" color="{{ item[age] >= 20 ? '#FFFFFF' : '#DDDDDD' }}" for="{{ for item in items }}">
class="hljs-name"View>
<View>
<View for="{{ for item in items }}">
展示結(jié)果如下,「這里需要注意的是當一個父節(jié)點在循環(huán)的時候,它的子節(jié)點也同樣會得到for生成的新變量,在展開子節(jié)點計算其屬性時,也能獲取到新的變量從而得到想要的結(jié)果?!?/strong>

到這里,動態(tài)綁定就差不多了,接下來就是將綁定后的模板交給Flex引擎,計算而已了。
如果你覺得這個文章對你有用,可以分享給更多的朋友。
謝謝!
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7310瀏覽量
93725 -
XML
+關(guān)注
關(guān)注
0文章
188瀏覽量
34298 -
渲染
+關(guān)注
關(guān)注
0文章
78瀏覽量
11323
發(fā)布評論請先 登錄
基本共射放大電路的組成、靜態(tài)分析及動態(tài)分析
請問Labview如何讓多個按鈕控件動態(tài)和enter鍵綁定
動態(tài)限載系統(tǒng)的設(shè)計和分析
某裝備結(jié)構(gòu)動態(tài)特性分析
Java解析XML的一種數(shù)據(jù)綁定技術(shù)
一種可在動態(tài)環(huán)境下構(gòu)建語義地圖的算法
共射極放大電路的動態(tài)參數(shù) 動態(tài)分析步驟
動態(tài)模板語義分析-實現(xiàn)AST節(jié)點
一個動態(tài)環(huán)境下的實時語義RGB-D SLAM系統(tǒng)

動態(tài)模板語義分析-動態(tài)綁定XML
評論