UI5 Data Model

Create a Model:

一個(gè)model中的業(yè)務(wù)數(shù)據(jù)可以由不同的格式來(lái)定義:

  • JavaScript Object Notation (JSON)
  • Extensible Markup Language (XML)
  • OData
  • Your own custom format

還有一種特殊的model類(lèi)型叫做 "resource model". This model type is used as a wrapper object around a resource bundle file. 文件名以.properties 結(jié)尾楞陷,通常用在存放多語(yǔ)言相關(guān)的text.

當(dāng)創(chuàng)建JSON, XML以及resource model這些類(lèi)型的model時(shí)结执,它們包含的內(nèi)容是一次性載入的(local file或者request web server)献幔。換句話(huà)說(shuō)趾诗,在請(qǐng)求完這些類(lèi)型的model的數(shù)據(jù)之后恃泪,整個(gè)model對(duì)于application都是可見(jiàn)狀態(tài)了。
這些Model類(lèi)型被稱(chēng)為client-side models糕非,類(lèi)似于filtering和sorting之類(lèi)的任務(wù)都在client本地執(zhí)行朽肥。

對(duì)比OData model類(lèi)型,是另外一種server-side models。意味著不管何時(shí)application需要從model取得數(shù)據(jù)州刽,必須從server端去request穗椅。基本每次request不會(huì)返回全部的數(shù)據(jù)宣鄙,因?yàn)閿?shù)據(jù)量一般比較龐大冻晤。因此锦茁,類(lèi)似sorting和filtering的任務(wù)每次都會(huì)分配到server端绣硝。

Creat Property Binding:

Preview

image.png

Figure : Screen with text derived from various sources (No visual changes to last step)

Coding
webapp/index.html

...
 <script>
  // Attach an anonymous function to the SAPUI5 'init' event
  sap.ui.getCore().attachInit(function () {
   // Create a JSON model from an object literal
   var oModel = new sap.ui.model.json.JSONModel({
    greetingText: "Hi, my name is Harry Hawk"
   });
 
   // Assign the model object to the SAPUI5 core
   sap.ui.getCore().setModel(oModel);
   // Display a text element whose text is derived
   // from the model object
   new sap.m.Text({ text : "{/greetingText}" }).
    placeAt("content");
  });
 </script>
...

sap.m.Text control的 text property設(shè)值為 {/greetingText}. 大括號(hào)括起來(lái)的binding path會(huì)被自動(dòng)識(shí)別為是binding够傍。這些binding稱(chēng)為PropertyBindings 。在這個(gè)例子里寂诱,控件的text property被綁定到位于default model的root路徑的 greetingText 痰洒。binding路徑開(kāi)頭的斜杠 (/) 表示是絕對(duì)綁定路徑浴韭。

Two-Way Data Binding:

Preview


Figure: Input fields can be enabled or disabled

Coding
webapp/view/App.view.xml (New)

<mvc:View xmlns="sap.m" xmlns:mvc="sap.ui.core.mvc">
  <Panel headerText="{/panelHeaderText}" class="sapUiResponsiveMargin" width="auto">
    <content>
      <Label text="First Name" class="sapUiSmallMargin" />
      <Input value="{/firstName}" valueLiveUpdate="true" width="200px" enabled="{/enabled}" />
      <Label text="Last Name" class="sapUiSmallMargin" />
      <Input value="{/lastName}" valueLiveUpdate="true" width="200px" enabled="{/enabled}" />
      <CheckBox selected="{/enabled}" text="Enabled" />
    </content>
  </Panel></mvc:View>

這里創(chuàng)建了一個(gè)新的view目錄,和一個(gè)新的XML view嗡靡。

webapp/index.html

<!DOCTYPE html><html><head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta charset="utf-8">
        <title>SAPUI5 Data Binding Tutorial</title>
        <script
                id="sap-ui-bootstrap"
                src="../../../../../../../../../resources/sap-ui-core.js"
                data-sap-ui-theme="sap_belize"
                data-sap-ui-libs="sap.m"
                data-sap-ui-compatVersion="edge"
                data-sap-ui-preload="async"
                data-sap-ui-resourceroots='{ "sap.ui.demo.db": "./" }'
                >
        </script>
        <script>
                // Attach an anonymous function to the SAPUI5 'init' event
                sap.ui.getCore().attachInit(function () {
                        // Create a JSON model from an object literal
                        var oModel = new sap.ui.model.json.JSONModel({
                                firstName: "Harry",
                                lastName: "Hawk",
                                enabled: true,
                                panelHeaderText: "Data Binding Basics"
                        });
                        // Assign the model object to the SAPUI5 core
                        sap.ui.getCore().setModel(oModel);
 
                      // Display the XML view called "App"
                        new sap.ui.core.mvc.XMLView({ viewName : "sap.ui.demo.db.view.App" })
                                .placeAt("content");
                });
        </script></head><body class="sapUiBody" id="content"></body></html>
  • 在bootstrap里增加data-sap-ui-resourcerouts 參數(shù)柿祈。
  • 刪掉了上一步的sap.m.Text控件谍夭,用新建的XML view(用它的resource name調(diào)用)取而代之紧索。
  • 刷新頁(yè)面之后珠漂,嘗試選擇和取消checkbox,可以觀(guān)察到input框會(huì)根據(jù)checkbox的狀態(tài)自動(dòng)enable和disable
image.png
image.png

雖然我們沒(méi)有寫(xiě)任何代碼在UI和model之間傳值,但是Input控件的狀態(tài)可以隨著checkbox的狀態(tài)變化抓谴。SAPUI5的model實(shí)現(xiàn)了雙向數(shù)據(jù)綁定(two-way data binding )。對(duì)于JSON類(lèi)型的model來(lái)說(shuō)滩届,默認(rèn)的設(shè)置就是two-way binding帜消。

注意兩點(diǎn):

  • 數(shù)據(jù)綁定使得控件的property可以從一個(gè)model中獲得任何一個(gè)合適的property的值浓体。
  • SAPUI5會(huì)自動(dòng)處理從model到控件的數(shù)據(jù)傳輸汹碱,以及從控件到model的傳值咳促。這種方式叫做two-way binding.

One-Way Data Binding:

Preview


Figure: Two-way data binding disabled for the checkbox

Coding
webapp/index.html

...
    <script>
      var oModel = new sap.ui.model.json.JSONModel({
        firstName : "Harry",
        lastName  : "Hawk",
        enabled   : true,
        panelHeaderText : "Data Binding Basics"
      });
      oModel.setDefaultBindingMode(sap.ui.model.BindingMode.OneWay); 
      // Assign the model object to the SAPUI5 core
      sap.ui.getCore().setModel(oModel);
...

加入如上語(yǔ)句,改變綁定模式為one-way冲茸。

修改后轴术, 不管checkbox的狀態(tài)如何逗栽,input框保持可以輸入鳄虱。
單向綁定(one-way binding)保證了數(shù)據(jù)永遠(yuǎn)只從model傳向UI决记。

綁定模式(單向/雙向)是設(shè)置在model對(duì)象上的系宫。所以楼镐,除非你顯式的改變它,一個(gè)新的binding instance就會(huì)使用默認(rèn)模式凄杯。

要改變binding mode戒突, 有兩種方式:

  • 改變model的默認(rèn)binding mode描睦。就像上面例子里做的那樣忱叭。
  • 為一個(gè)binding instance指定一個(gè)binding mode韵丑,使用參數(shù) oBindingInfo.mode钓株。這樣的話(huà),只改變某個(gè)特定binding instance的mode碗短。其它的
    binding instances 仍舊使用默認(rèn)mode。參考 API Reference: sap.ui.base.ManagedObject.bindProperty
    .
    Note
    關(guān)于改變binding mode要注意的兩點(diǎn):
  • 如果改變了一個(gè)model的默認(rèn)binding mode (像例子中的做法), 那么除非你在顯式地修改回來(lái),所有之后的binding instances會(huì)使用修改過(guò)的binding mode.
  • 修改一個(gè)model的默認(rèn)binding mode咳秉,對(duì)于已經(jīng)生成的binding instance不會(huì)起效向挖。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市溶推,隨后出現(xiàn)的幾起案子蒜危,更是在濱河造成了極大的恐慌辐赞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赘风,死亡現(xiàn)場(chǎng)離奇詭異贝次,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)位谋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)笋轨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)仅讽,“玉大人洁灵,你說(shuō)我怎么就攤上這事√老牵” “怎么了闲礼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵柑贞,是天一觀(guān)的道長(zhǎng)棠众。 經(jīng)常有香客問(wèn)我闸拿,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任篱瞎,我火速辦了婚禮,結(jié)果婚禮上严衬,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好粱挡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著劣坊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪局冰。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天康二,我揣著相機(jī)與錄音勇蝙,去河邊找鬼。 笑死味混,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翁锡。 我是一名探鬼主播蔓挖,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼馆衔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼角溃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起减细,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎未蝌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體树埠,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年又碌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了九昧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铸鹰。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蹋笼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剖毯,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布逊谋,位于F島的核電站,受9級(jí)特大地震影響胶滋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜究恤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一后德、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧探遵,春花似錦、人聲如沸箱季。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)作煌。三九已至,卻和暖如春粟誓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹰服。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工揽咕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留套菜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓逗柴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親戏溺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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