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é)點進行重復(fù)或者顯示與隱藏等操作,因此: 我們規(guī)定
for="{{for xx item xxs}}" 用于實現(xiàn)重復(fù)組件
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語句中定義了一個新的變量,當(dāng)我們在展開時需要將新的變量(item)注入到變量環(huán)境中,item將覆蓋上一級環(huán)境變量中的item的值。
這與棧幀調(diào)用時的本地變量覆蓋上一級范圍中的變量是一樣的道理。
」** 展開之后,item是items中的每一個元素而不是根節(jié)點上的item了。
此時再對每個節(jié)點進行消解運算
注入的環(huán)境變量如下:
if語句相對簡單一點,它不會產(chǎn)生新的變量,只需要對表達式求值,獲取表達式的結(jié)果true則保留,false則刪除節(jié)點不展示。
測試一下,對一個相對復(fù)雜的模板進行動態(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é)果如下,「這里需要注意的是當(dāng)一個父節(jié)點在循環(huán)的時候,它的子節(jié)點也同樣會得到for生成的新變量,在展開子節(jié)點計算其屬性時,也能獲取到新的變量從而得到想要的結(jié)果?!?/strong>
到這里,動態(tài)綁定就差不多了,接下來就是將綁定后的模板交給Flex引擎,計算而已了。
如果你覺得這個文章對你有用,可以分享給更多的朋友。
謝謝!
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
6808瀏覽量
88743 -
XML
+關(guān)注
關(guān)注
0文章
187瀏覽量
33022 -
渲染
+關(guān)注
關(guān)注
0文章
69瀏覽量
10901
發(fā)布評論請先 登錄
相關(guān)推薦
評論