亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

extjs-mvc結(jié)構(gòu)實(shí)踐(二):基本頁(yè)面

changfeng1050 / 1689人閱讀

摘要:接著來(lái),上一篇搭建了基本的項(xiàng)目骨架,到最后,其實(shí)啥也沒(méi)看見(jiàn)。。。目標(biāo)全屏顯示左側(cè)導(dǎo)航菜單,右側(cè)標(biāo)簽頁(yè)切換操作內(nèi)容區(qū)域。一般模型與你后臺(tái)返回的數(shù)據(jù)結(jié)構(gòu)一一對(duì)應(yīng)。給其他組件提供一致接口使用數(shù)據(jù)。整個(gè)構(gòu)成一個(gè)所謂的。

接著來(lái),上一篇搭建了基本的項(xiàng)目骨架,到最后,其實(shí)啥也沒(méi)看見(jiàn)。。。
書(shū)接上回,開(kāi)始寫(xiě)UI效果。
目標(biāo)

全屏顯示、左側(cè)導(dǎo)航菜單,右側(cè)標(biāo)簽頁(yè)切換操作內(nèi)容區(qū)域。包含header和footer

導(dǎo)航菜單動(dòng)態(tài)ajax產(chǎn)生,點(diǎn)擊對(duì)應(yīng)菜單可以動(dòng)態(tài)加載js資源或者數(shù)據(jù)

不要太丑?。。。?/p> 先扯點(diǎn)概念:

一些基本的Extjs概念本文不會(huì)去講,請(qǐng)參考官網(wǎng)API文檔。
但是對(duì)于用java的同志來(lái)說(shuō),看extjs的結(jié)構(gòu)應(yīng)該是很容易的

定義與創(chuàng)建 define vs create

///////extjs
Ext.define("Cat",{//定義一只貓
name:"小甜甜"http://名字
})  
  
///////java
class Cat(){//定義一只貓
private String name;
}
///////extjs
Ext.create("Cat",{//創(chuàng)建一只貓
name:"牛夫人"http://
})  

///////java
Cat cat= new Cat();
cat.setName="牛夫人";

Model模型是個(gè)啥?

直白點(diǎn)說(shuō)吧,模型就是模型,,就是實(shí)體類(lèi),就是entity,就是POJO,,,,就是.......
總之,模型是用來(lái)定義一個(gè)東西的屬性的。一般模型與你后臺(tái)返回的數(shù)據(jù)結(jié)構(gòu)一一對(duì)應(yīng)。
比如:一個(gè)用戶模型:

Ext.define("luter.model.User", {
    extend: "Ext.data.Model",
    fields: [
        {name: "id", type: "string"},//用戶id
        {name: "username", type: "string"},//用戶名
        {name: "gender", type: "string"},//性別
        {name: "real_name", type: "string"}//真實(shí)姓名
    ]
});

要模型干啥?哎,開(kāi)始我也這么想過(guò),后來(lái)看到store

Store是干啥的?

好了,你有數(shù)據(jù)庫(kù),你有后臺(tái),你甚至都用js定義了數(shù)據(jù)模型(Model),那你數(shù)據(jù)怎么來(lái)?
Store簡(jiǎn)單理解,就是干這個(gè)的,Store用來(lái)獲取數(shù)據(jù),管理數(shù)據(jù),前端保存數(shù)據(jù)。給其他組件提供一致接口使用數(shù)據(jù)。Store定義了數(shù)據(jù)怎么獲取數(shù)據(jù)、拿到后如何處理數(shù)據(jù)。如下例:

//定義一個(gè)user store
Ext.define("luter.store.User", {
    extend: "Ext.data.Store",
    autoLoad: false,
    model: "luter.model.User",//這就是user model, 用戶模型
    pageSize: 15,//分頁(yè)頁(yè)面大小
    remoteSort: true,//服務(wù)端排序
    sortOnLoad: true,
    proxy: {//proxy規(guī)定了從什么地方以什么方式獲取數(shù)據(jù),并且返回?cái)?shù)據(jù)應(yīng)該如何解析獲取
        type: "ajax",
        actionMethods: {
            create: "POST",
            read: "POST",
            update: "POST",
            destroy: "POST"
        },
        api: {
            read: "app/testdata/user.json"
        },
        reader: {//返回?cái)?shù)據(jù)如何讀取
            type: "json",
            root: "root",
            successProperty: "success",
            totalProperty: "total"
        },
        listeners: {//當(dāng)發(fā)生ajax異常的時(shí)候,回調(diào)處理。
            exception: function (proxy, response, operation, eOpts) {
                DealAjaxResponse(response);
            }
        }
    },
    sorters: {//排序規(guī)則。
        property: "id",
        direction: "DESC"
    }

});


view是什么?

view就是。。。。。。UI?。。?!grid啊、button啊、panel啊、tree啊 form啊。。。等等。。。。
顯示數(shù)據(jù),接受用戶操作,給用戶操作反饋....反正用戶看到的地方,就是view

:>理解沒(méi)?

新建入口文件app.js
對(duì)于extjs而言,一個(gè)應(yīng)用也就是application,對(duì)應(yīng)Ext.Application類(lèi)。一個(gè)應(yīng)用可以有自己的類(lèi)體系,store、view、Model等元素。整個(gè)構(gòu)成一個(gè)所謂的:app。app.js是整個(gè)應(yīng)用的入口,用來(lái)初始化Ext.Application,當(dāng)然,你可以不叫app.js,比如叫:aipapa.js,都是可以滴??!但是里面是干這個(gè)事情的。。。
/**
 * 設(shè)置Extjs的動(dòng)態(tài)加載路徑
 */
Ext.Loader.setConfig({
    enabled: true,
    paths: {
        "Ext": "app/vendor/extjs/6.2.0",
        "Ext.ux": "app/vendor/extjs/6.2.0/ux"
    }
});
/**
 * 是否開(kāi)啟url緩存,就是xxx.com?_dc=123123123123類(lèi)似這種
 */
Ext.Ajax.disableCaching = false;
/**
 * 初始化工具提示
 */
Ext.QuickTips.init();
Ext.application({
    name: "luter",//這個(gè)應(yīng)用叫啥,其實(shí)就是目錄名字
    /**
     * 你把這個(gè)應(yīng)用放哪個(gè)目錄下了,控制器啊store啊view啥的,在哪里?
     * 以后定義一個(gè)叫Ext.define("luter.model.Car",{})的時(shí)候,其實(shí)就是指向了js文件:app/luter/model/Car.js
     * requiere就會(huì)動(dòng)態(tài) ajax load這個(gè)js下來(lái)
     */
    appFolder: "app/luter",
    init: function () {//先初始化
        console.log("init")
    }, launch: function () {//發(fā)射!
        console.log("launch")
    }
});

最后,在入口html中記得引入這個(gè)文件。不出意外的話預(yù)覽app.html,console里應(yīng)該能看到點(diǎn)信息了,當(dāng)然,依然沒(méi)啥UI效果....接下來(lái)就創(chuàng)建view

開(kāi)始創(chuàng)建主view
主view基礎(chǔ)是一個(gè)viewport,采用Border布局,頭部header+底部footer+左側(cè)導(dǎo)航樹(shù)+中間tab頁(yè)內(nèi)容切換。為了方便管理,主view統(tǒng)一放在main目錄下,
主視窗: app/luter/view/main/viewport.js
 /**
 * 主視圖占滿全屏是個(gè)viewport
 */
Ext.define("luter.view.main.ViewPort", {
    extend: "Ext.Viewport",
    alias: "widget.viewport",//別名,與xtype對(duì)應(yīng)
    layout: "border",//東南西北中布局,邊界嘛
    stores: [],
    requires: [],
    initComponent: function () {
        var me = this;
        Ext.apply(me, {
            items: [{
                region: "north",
                height: 40,
                title: "北方",
                xtype: "panel"
            }, {
                region: "west",
                xtype: "panel",
                title: "西方",
                width: 200
            }, {
                region: "center",
                title: "中間",
                xtype: "panel"

            }, {
                region: "south",
                xtype: "panel",
                title: "南方",
                height: 40
            }]
        });
        me.callParent(arguments);
    }
});
建立主控制器:app/luter/controller/MainController.js
Ext.define("luter.controller.MainController", {
    extend: "Ext.app.Controller",
    views: ["main.ViewPort"],//默認(rèn)views會(huì)尋找項(xiàng)目目錄下的view目錄,也就是會(huì)掃描到app/luter/view了,所以直接下下級(jí)路徑即可。
    stores: [],
    init: function (application) {
        var me = this;
        this.control({
            "viewport": {//監(jiān)聽(tīng)viewport的初始化事件,可以做點(diǎn)其他事情在這里,如有必要,記得viewport定義里的alias么?
                "beforerender": function () {
                    console.log("viewport begin render at:" + new Date());
                },
                "afterrender": function () {
                    console.log("viewport  render finished at:" + new Date());

                },
            }
        });
    }

});

控制器有了,視圖有了,接下來(lái)讓程序顯示這個(gè)UI,修改app.js

修改app入口: app/luter/app.js
/**
 * 設(shè)置Extjs的動(dòng)態(tài)加載路徑
 */
Ext.Loader.setConfig({
    enabled: true,
    paths: {
        "Ext": "app/vendor/extjs/6.0.0",
        "Ext.ux": "app/vendor/extjs/6.0.0/ux"
    }
});
/**
 * 是否開(kāi)啟url緩存,就是xxx.com?_dc=123123123123類(lèi)似這種
 */
Ext.Ajax.disableCaching = false;
/**
 * 初始化工具提示
 */
Ext.QuickTips.init();
var luterapp;//定義一個(gè)全局app對(duì)象,便于后續(xù)使用
Ext.application({
    name: "luter",//這個(gè)應(yīng)用叫啥,其實(shí)就是目錄名字
    /**
     * 你把這個(gè)應(yīng)用放哪個(gè)目錄下了,控制器啊store啊view啥的,在哪里?
     * 以后定義一個(gè)叫Ext.define("luter.model.Car",{})的時(shí)候,其實(shí)就是指向了js文件:app/luter/model/Car.js
     * requiere就會(huì)動(dòng)態(tài) ajax load這個(gè)js下來(lái)
     */
    appFolder: "app/luter",
    init: function () {//先初始化
        console.log("init")
    }, launch: function () {//發(fā)射!
        console.log("launch")
        luterapp = this;
        this.loadModule({
            moduleId: "MainController"
        });
        var module = this.getController("MainController");//加載這個(gè)控制器
        var viewName = module.views[0];//獲取到這個(gè)控制器里的第一個(gè)view名字
        var view = module.getView(viewName);//獲取到這個(gè)view,本質(zhì)上就是加載js文件
        view.create();//創(chuàng)建這個(gè)view
    },
    /**
     * 動(dòng)態(tài)加載控制器
     * @param config
     * @returns {boolean}
     */
    loadModule: function (config) {
        if (!Ext.ClassManager.isCreated(config.moduleId)) {
            console.log("controller:" + config.moduleId + "  is not load ,now load in.....");
            try {
                var module = luterapp.getController(config.moduleId);
            } catch (error) {
                showFailMesg({
                    msg: ":<> O!   No:load module fail,the module object is null." +
                    "
maybe :the module is Not available now." + "
Error: " + error }); return false; } finally { } } } });

這里面用到了一個(gè)showFailMesg的函數(shù),這種彈出提示框的東西,可以做成通用的函數(shù)放在utils里,后續(xù)這個(gè)工具類(lèi)會(huì)逐漸完善。
如下:

通用函數(shù)工具類(lèi): app/luter/utils.js
/**
 * 操作成功提示
 */
function showSucMesg(config) {
    Ext.Msg.show({
        title: "成功",
        msg: config.msg || "",
        width: 400,
        buttons: Ext.Msg.OK,
        icon: Ext.MessageBox.INFO,
        fn: config.fn || ""
    });
}

/**
 * 操作失敗提示
 */
function showFailMesg(config) {
    Ext.Msg.show({
        title: config.title || "失敗",
        msg: config.msg || "",
        width: 450,
        buttons: Ext.Msg.OK,
        icon: Ext.MessageBox.ERROR,
        fn: config.fn || ""
    });
}

當(dāng)然,這個(gè)js也需要在入口html引入,在app.js之前引入。如下:

修改入口html: app/app.html



    
    EXTJS6.2.0MVC
    
    
    
    
    
    
    











至此,沒(méi)什么意外的話,應(yīng)該是可以看到界面了!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/92683.html

相關(guān)文章

  • extjs-mvc結(jié)構(gòu)實(shí)踐(三):完善基本頁(yè)面

    摘要:上篇實(shí)現(xiàn)了基本的代碼架構(gòu),控制器動(dòng)態(tài)加載功能以及一個(gè)基礎(chǔ)的頁(yè)面布局,本節(jié)開(kāi)始,將陸續(xù)完善這個(gè)頁(yè)面。頁(yè)面底部區(qū)域,主要顯示版權(quán)信息等,也可以顯示個(gè)時(shí)間啥的。。。頭部和底部定義完畢后,需要在中引入對(duì)應(yīng)位置。 上篇實(shí)現(xiàn)了基本的代碼架構(gòu),控制器動(dòng)態(tài)加載功能以及一個(gè)基礎(chǔ)的頁(yè)面布局,本節(jié)開(kāi)始,將陸續(xù)完善這個(gè)頁(yè)面。 目標(biāo) 如前所述,我們的頁(yè)面包含這么幾個(gè)區(qū)域: header: UI頂部區(qū)域,顯示系...

    zhkai 評(píng)論0 收藏0
  • extjs-mvc結(jié)構(gòu)實(shí)踐(三):完善基本頁(yè)面2

    摘要:結(jié)構(gòu)實(shí)踐三完善基本頁(yè)面一般經(jīng)典的后臺(tái)管理系統(tǒng),都是左側(cè)菜單右側(cè)結(jié)構(gòu)布局。不免俗,咱也這么實(shí)現(xiàn)定義左側(cè)導(dǎo)航菜單新建采用的組件構(gòu)建一個(gè)導(dǎo)航菜單為了顯示圖標(biāo),引入字體圖標(biāo),在引入引入定義導(dǎo)航菜單數(shù)據(jù)功能菜單展開(kāi)節(jié)點(diǎn)。 extjs-mvc結(jié)構(gòu)實(shí)踐(三):完善基本頁(yè)面2 一般經(jīng)典的后臺(tái)管理系統(tǒng),都是左側(cè)菜單右側(cè)tabs結(jié)構(gòu)布局。不免俗,咱也這么實(shí)現(xiàn)! 定義左側(cè)導(dǎo)航菜單 新建:app/luter/...

    X1nFLY 評(píng)論0 收藏0
  • extjs-mvc結(jié)構(gòu)實(shí)踐(一):搭建基礎(chǔ)架構(gòu)

    摘要:今天開(kāi)始,一點(diǎn)點(diǎn)記錄一下使用搭建一個(gè)基礎(chǔ)結(jié)構(gòu)的過(guò)程。沒(méi)辦法,記性差這種結(jié)構(gòu)的前端,主要是面向后臺(tái)信息管理系統(tǒng),可以最大限度的規(guī)范前端代碼結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)。 今天開(kāi)始,一點(diǎn)點(diǎn)記錄一下使用extjs6.2.0搭建一個(gè)基礎(chǔ)MVC結(jié)構(gòu)的過(guò)程。沒(méi)辦法,記性差:)這種結(jié)構(gòu)的UI前端,主要是面向后臺(tái)信息管理系統(tǒng),可以最大限度的規(guī)范前端代碼結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)。做網(wǎng)站 或者手機(jī)端,這種方式全引入了extjs,...

    kamushin233 評(píng)論0 收藏0
  • extjs-mvc結(jié)構(gòu)實(shí)踐(四):導(dǎo)航菜單與控制器模塊聯(lián)動(dòng)

    摘要:根據(jù)模塊創(chuàng)建模塊失敗。在中,我們配置了標(biāo)明了這是一個(gè)控制器模塊,點(diǎn)擊后會(huì)去觸發(fā)控制器加載動(dòng)作。正常情況下同一個(gè)模塊的只加載一次。 前面幾篇文檔,我們基本實(shí)現(xiàn)了一個(gè)靜態(tài)的extjs頁(yè)面,本篇開(kāi)始,實(shí)現(xiàn)左側(cè)導(dǎo)航樹(shù)與右側(cè)內(nèi)容的聯(lián)動(dòng),也就是點(diǎn)擊導(dǎo)航菜單,加載對(duì)應(yīng)模塊頁(yè)面和業(yè)務(wù)邏輯,實(shí)現(xiàn)js文件的按需加載。 業(yè)務(wù)需求是這樣的: 左側(cè)的treelist,當(dāng)點(diǎn)擊某個(gè)節(jié)點(diǎn)的時(shí)候,系統(tǒng)根據(jù)tree數(shù)據(jù)里...

    figofuture 評(píng)論0 收藏0
  • extjs-mvc結(jié)構(gòu)實(shí)踐(五):實(shí)現(xiàn)用戶管理的增刪改查

    摘要:而且上一篇文章中,也已經(jīng)實(shí)現(xiàn)了一個(gè)基本的用戶管理列表頁(yè)面。接著上一篇,完善用戶管理,實(shí)現(xiàn)增刪改。為了用戶體驗(yàn),增加和修改用戶信息的表單,都放在彈窗中進(jìn)行。 經(jīng)過(guò)前面幾篇文章的介紹,一個(gè)基本的MVC結(jié)構(gòu)應(yīng)該是具備了。而且上一篇文章中,也已經(jīng)實(shí)現(xiàn)了一個(gè)基本的用戶管理列表頁(yè)面。接著上一篇,完善用戶管理,實(shí)現(xiàn)增刪改。為了用戶體驗(yàn),增加和修改用戶信息的表單,都放在彈窗中進(jìn)行。避免跳轉(zhuǎn)頁(yè)面。 定義...

    wendux 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<