SAPUI5 (08) - MVC的Model和數(shù)據(jù)綁定

前面的MVC介紹只有view和controller溃肪,還沒有涉及數(shù)據(jù),所以沒有model的部分痹栖。本篇增加數(shù)據(jù),介紹Model以及數(shù)據(jù)綁定瞭空,展示一個完整的MVC示例揪阿。我們將要實現(xiàn)的示例是在頁面中顯示供應(yīng)商的列表,每個供應(yīng)商含有ID和Name兩個字段咆畏。

首先介紹幾個相關(guān)的知識點图甜。因為我們打算在表格(Table)中顯示供應(yīng)商,所以我們選擇sap.ui.table.Table控件鳖眼,這個控件對PC和Tablet有很好的適應(yīng),界面漂亮嚼摩,功能強大。

知識點介紹

sap.ui.table.Table

官方參考

Table以行和列的方式顯示數(shù)據(jù)霉撵,這種樣式我相信大家都很熟悉涂佃,展示方法就像Excel,有行和列構(gòu)成缚去。本篇將使用sap.ui.table.Table的如下屬性:

width : sap.ui.core.CSSSize (default: auto)。表格的寬度可以是百分百琼开,或者基于像素易结。
visibleRowCount : int (default: 10)。默認顯示10行柜候,可以自定義搞动。
firstVisibleRow : int (default: 0)
selectionMode : sap.ui.table.SelectionMode (default: MultiToggle)。包括單行(sap.ui.table.SelectionMode.Single)渣刷、多行(sap.ui.table.SelectionMode.MultiToggle)和不能選擇行(sap.ui.table.SelectionMode.None)鹦肿。
editable : boolean (default: true)。默認可以編輯辅柴,如果只是顯示箩溃,將此屬性設(shè)置為false。

Table的聚合(Aggregation):

title : sap.ui.core.Control|string
columns : sap.ui.table.Column[] (default)

sap.ui.table.Column

官方參考

定義Table的列碌嘀。本篇要用到的屬性:

width : sap.ui.core.CSSSize
sortProperty : string涣旨。指定按哪個字段進行排序。

聚合:

label : sap.ui.core.Control|string (default)
template : sap.ui.core.Control股冗。template聚合屬性是一個控件霹陡,通過控件來綁定數(shù)據(jù)。

Models

MVC的Model代表應(yīng)用程序的數(shù)據(jù)魁瞪,如果數(shù)據(jù)來自客戶端(client)穆律,有JSON model、XML model和Resource model三種; 如果數(shù)據(jù)來自服務(wù)器端(server)导俘,有oData model峦耘。不管這些數(shù)據(jù)來自何處,sapui5都需要進行加載和使用旅薄。我們第一個例子辅髓,使用JSON model,JSON數(shù)據(jù)采取硬編碼方式少梁。為了方便介紹洛口,先貼出完整代碼。

不用MVC方式的代碼

<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta http-equiv='Content-Type' content='text/html;charset=UTF-8'/>

        <script src="resources/sap-ui-core.js"
                id="sap-ui-bootstrap"
                data-sap-ui-libs="sap.m, sap.ui.table"
                data-sap-ui-theme="sap_bluecrystal">
        </script>

        <script>
            // application data
            var oAppData = 
            {
                "CountSuppliers" : 2,
                "Suppliers" : [{
                        "ID": 1,
                        "Name": "中國圖書進出口公司"
                    }, {
                        "ID": 2,
                        "Name": "東莞少兒玩具制造廠"
                    }                   
                ]           
            };
            
            var oModel = sap.ui.model.json.JSONModel();
            oModel.setData(oAppData);
            
            // setting the model to the core
            // so that it's available to the whole application
            sap.ui.getCore().setModel(oModel);
            
            // define columns and table
            var oIdCol = new sap.ui.table.Column({
                label: new sap.m.Label({text:"ID"}),
                template: new sap.m.Text().bindProperty("text", "ID"),
                sortProperty: "ID",
                width: "100px"
            });
            
            var oNameCol = new sap.ui.table.Column({
                label: new sap.m.Label({text:"Name"}),
                template: new sap.m.Text().bindProperty("text", "Name"),
                sortProperty: "Name",
                width: "150px"
            });
            
            var oTable = new sap.ui.table.Table({
                width: "100%",
                title: "供應(yīng)商列表",
                visibleRowCount: 2,
                firstVisibleRow: 0,
                editable: false,
                selectionMode: sap.ui.table.SelectionMode.Single,
                columns: [oIdCol, oNameCol]
            });
            
            oTable.setModel(oModel);
            oTable.bindRows("/Suppliers");  
            
            // define page & app
            var oPage = new sap.m.Page("masterpage", {  
                title: "供應(yīng)商",
                content: [oTable]
            });
            
            var oApp = new sap.m.App("myApp");
            
            oApp.addPage(oPage);
            oApp.placeAt("content");            
            
        </script>

    </head>
    <body class="sapUiBody SapUiResponsiveMargin" role="application">
        <div id="content"></div>
    </body>
</html>

代碼分為三個部分凯沪,第一個部分是定義JSON數(shù)據(jù)第焰,并加載。JSON數(shù)據(jù)包含兩個供應(yīng)商的數(shù)據(jù)妨马,每個供應(yīng)商有ID和Name兩個字段挺举。var oModel = sap.ui.model.json.JSONModel();聲明一個JSONModel杀赢,oModel.setData(oAppData);語句設(shè)置JSON model的數(shù)據(jù)為剛剛定義的JSON數(shù)據(jù);sap.ui.getCore().setModel(oModel);語句設(shè)置core對象的Model為oModel湘纵,這樣oModel對整個應(yīng)用程序可見脂崔。

第二部分是聲明sap.ui.Table類的對象,以及綁定數(shù)據(jù)梧喷。

            // define columns and table
            var oIdCol = new sap.ui.table.Column({
                label: new sap.m.Label({text:"ID"}),
                template: new sap.m.Text().bindProperty("text", "ID"),
                sortProperty: "ID",
                width: "100px"
            });
            
            var oNameCol = new sap.ui.table.Column({
                label: new sap.m.Label({text:"Name"}),
                template: new sap.m.Text().bindProperty("text", "Name"),
                sortProperty: "Name",
                width: "150px"
            });
            
            var oTable = new sap.ui.table.Table({
                width: "100%",
                title: "供應(yīng)商列表",
                visibleRowCount: 2,
                firstVisibleRow: 0,
                editable: false,
                selectionMode: sap.ui.table.SelectionMode.Single,
                columns: [oIdCol, oNameCol]
            });
            
            oTable.setModel(oModel);
            oTable.bindRows("/Suppliers");  

先定義兩個sap.ui.table.Column對象砌左,sap.ui.table.Column對象的template設(shè)置為sap.m.Text對象,并與JSON model的ID和Name兩列綁定铺敌。我們暫且不用管數(shù)據(jù)綁定的細節(jié)汇歹,后面會詳細介紹。

var oTable = ...語句聲明一個sap.ui.table.Table對象适刀,Table包含剛剛申明的兩個列對象秤朗。

oTable.setModel(oModel);實現(xiàn)Table與JSONModel的綁定,也就是View和Model的綁定笔喉。oTable.bindRows("/Suppliers");語句實現(xiàn)Table與JSON數(shù)據(jù)的綁定取视,JSON數(shù)據(jù)是層次化的數(shù)據(jù),如本例常挚,JSON數(shù)據(jù)的根目錄下有兩個值:CountSuppliers和Suppliers作谭,Table綁定Suppliers

第三個部分代碼就是申明App和Page奄毡,不多說折欠。程序運行界面:

MVC實現(xiàn)

仍然使用javascript view。項目的文件結(jié)構(gòu)如下:

項目文件結(jié)構(gòu)

index.html

<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta http-equiv='Content-Type' content='text/html;charset=UTF-8'/>

        <script src="resources/sap-ui-core.js"
                id="sap-ui-bootstrap"
                data-sap-ui-libs="sap.m, sap.ui.table"
                data-sap-ui-theme="sap_bluecrystal">
        </script>

        <script>
            jQuery.sap.registerModulePath("suppliers", "./suppliers");
                        
            var oApp = new sap.m.App({initialPage: "firstPage"});
            var oFirstPage = sap.ui.view({
                id: "firstPage",
                viewName: "suppliers.supplieroverview",
                type: "JS"
            });             
            
            oApp.addPage(oFirstPage);
            oApp.placeAt("content");
        </script>

    </head>
    <body class="sapUiBody SapUiResponsiveMargin" role="application">
        <div id="content"></div>
    </body>
</html>
  • jQuery.sap.registerModulePath("suppliers", "./suppliers");將suppliers注冊為當(dāng)前文件夾下的suppliers子文件夾吼过。

  • 定義一個sap.m.Appsap.ui.view锐秦,view加載到App,App放置在div中盗忱。

suppliers.json

將json數(shù)據(jù)放在一個單獨的文件中酱床,文件內(nèi)容如下:

{
    "CountSuppliers" : 2,
    "Suppliers" : [{
            "ID": 1,
            "Name": "中國圖書進出口公司"
        }, {
            "ID": 2,
            "Name": "東莞少兒玩具制造廠"
        }                   
    ]           
}

supplieroverview.view.js

sap.ui.jsview("suppliers.supplieroverview", {

    /** Specifies the Controller belonging to this View. 
    * In the case that it is not implemented, or that "null" is returned, this View does not have a Controller.
    * @memberOf suppliers.supplieroverview
    */ 
    getControllerName : function() {
        return "suppliers.supplieroverview";
    },

    /** Is initially called once after the Controller has been instantiated. It is the place where the UI is constructed. 
    * Since the Controller is given to this method, its event handlers can be attached right away. 
    * @memberOf suppliers.supplieroverview
    */ 
    createContent : function(oController) {
        // define columns and table
        var oColumns = [
            new sap.ui.table.Column({
                label: new sap.m.Label({text:"ID"}),
                template: new sap.m.Text().bindProperty("text", "ID"),
                sortProperty: "ID",
                width: "50px"
            }),
            new sap.ui.table.Column({
                label: new sap.m.Label({text:"Name"}),
                template: new sap.m.Text().bindProperty("text", "Name"),
                sortProperty: "ID",
                width: "100px"
            })
        ];  
        
        var oTable = new sap.ui.table.Table({
            width: "100%",
            title: "供應(yīng)商列表",
            visibleRowCount: 2,
            firstVisibleRow: 0,
            editable: false,
            selectionMode: sap.ui.table.SelectionMode.Single,
            columns: oColumns
        });         

        oTable.bindRows("/Suppliers");      
        
        var oPage = new sap.m.Page({
            title: "供應(yīng)商",
            content: [oTable]
        });
        
        return oPage;
    }
    
});

每個javascript view都有getControllerNamecreateContent兩個函數(shù)。顯示的內(nèi)容寫在createContent函數(shù)中趟佃。主要結(jié)構(gòu)如下:

var oColumns = ...;
var oTable = new sap.ui.table.Table({...});
oTable.bindRows("/Suppliers");

var oPage = new sap.m.Page({content: [oTable]});

return oPage;

supplieroverview.controller.js

sap.ui.controller("suppliers.supplieroverview", {

/**
* Called when a controller is instantiated and its View controls (if available) are already created.
* Can be used to modify the View before it is displayed, to bind event handlers and do other one-time initialization.
* @memberOf suppliers.supplieroverview
*/
    onInit: function() {        
        var oModel = sap.ui.model.json.JSONModel('models/suppliers.json');          
        this.getView().setModel(oModel);
    }
});

sap.ui.core.mvc.Controller對象的getView()方法獲得與之關(guān)聯(lián)的View扇谣,然后設(shè)置View與Model的關(guān)聯(lián)。

今天是2017年第一天闲昭,堅持罐寨!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市序矩,隨后出現(xiàn)的幾起案子鸯绿,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楞慈,死亡現(xiàn)場離奇詭異幔烛,居然都是意外死亡,警方通過查閱死者的電腦和手機囊蓝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來令蛉,“玉大人聚霜,你說我怎么就攤上這事≈槭澹” “怎么了蝎宇?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祷安。 經(jīng)常有香客問我姥芥,道長,這世上最難降的妖魔是什么汇鞭? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任凉唐,我火速辦了婚禮,結(jié)果婚禮上霍骄,老公的妹妹穿的比我還像新娘台囱。我一直安慰自己,他們只是感情好读整,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布簿训。 她就那樣靜靜地躺著,像睡著了一般米间。 火紅的嫁衣襯著肌膚如雪强品。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天屈糊,我揣著相機與錄音的榛,去河邊找鬼。 笑死另玖,一個胖子當(dāng)著我的面吹牛困曙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谦去,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼慷丽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鳄哭?” 一聲冷哼從身側(cè)響起要糊,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妆丘,沒想到半個月后锄俄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體局劲,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年奶赠,在試婚紗的時候發(fā)現(xiàn)自己被綠了鱼填。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡毅戈,死狀恐怖苹丸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苇经,我是刑警寧澤赘理,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站扇单,受9級特大地震影響商模,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜘澜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一施流、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兼都,春花似錦嫂沉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慎王,卻和暖如春蚓土,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赖淤。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工蜀漆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咱旱。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓确丢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吐限。 傳聞我的和親對象是個殘疾皇子鲜侥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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