摘要:接着来,上一篇搭建了基本的项目骨架,到最后,其实啥也没看见。。。目标全屏显示左侧导航菜单,右侧标签页切换操作内容区域。一般模型与你后台返回的数据结构一一对应。给其他组件提供一致接口使用数据。整个构成一个所谓的。
目标</>复制代码
接着来,上一篇搭建了基本的项目骨架,到最后,其实啥也没看见。。。
书接上回,开始写UI效果。
全屏显示、左侧导航菜单,右侧标签页切换操作内容区域。包含header和footer
导航菜单动态ajax产生,点击对应菜单可以动态加载js资源或者数据
不要太丑!!!!
先扯点概念:一些基本的Extjs概念本文不会去讲,请参考官网API文档。
但是对于用java的同志来说,看extjs的结构应该是很容易的
定义与创建 define vs create
</>复制代码
///////extjs
Ext.define("Cat",{//定义一只猫
name:"小甜甜"//名字
})
///////java
class Cat(){//定义一只猫
private String name;
}
</>复制代码
///////extjs
Ext.create("Cat",{//创建一只猫
name:"牛夫人"//
})
///////java
Cat cat= new Cat();
cat.setName="牛夫人";
Model模型是个啥?
直白点说吧,模型就是模型,,就是实体类,就是entity,就是POJO,,,,就是.......
总之,模型是用来定义一个东西的属性的。一般模型与你后台返回的数据结构一一对应。
比如:一个用户模型:
</>复制代码
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"}//真实姓名
]
});
要模型干啥?哎,开始我也这么想过,后来看到store
Store是干啥的?
好了,你有数据库,你有后台,你甚至都用js定义了数据模型(Model),那你数据怎么来?
Store简单理解,就是干这个的,Store用来获取数据,管理数据,前端保存数据。给其他组件提供一致接口使用数据。Store定义了数据怎么获取数据、拿到后如何处理数据。如下例:
</>复制代码
//定义一个user store
Ext.define("luter.store.User", {
extend: "Ext.data.Store",
autoLoad: false,
model: "luter.model.User",//这就是user model, 用户模型
pageSize: 15,//分页页面大小
remoteSort: true,//服务端排序
sortOnLoad: true,
proxy: {//proxy规定了从什么地方以什么方式获取数据,并且返回数据应该如何解析获取
type: "ajax",
actionMethods: {
create: "POST",
read: "POST",
update: "POST",
destroy: "POST"
},
api: {
read: "app/testdata/user.json"
},
reader: {//返回数据如何读取
type: "json",
root: "root",
successProperty: "success",
totalProperty: "total"
},
listeners: {//当发生ajax异常的时候,回调处理。
exception: function (proxy, response, operation, eOpts) {
DealAjaxResponse(response);
}
}
},
sorters: {//排序规则。
property: "id",
direction: "DESC"
}
});
view是什么?
view就是。。。。。。UI啊!!!grid啊、button啊、panel啊、tree啊 form啊。。。等等。。。。
显示数据,接受用户操作,给用户操作反馈....反正用户看到的地方,就是view
:>理解没?
新建入口文件app.js</>复制代码
对于extjs而言,一个应用也就是application,对应Ext.Application类。一个应用可以有自己的类体系,store、view、Model等元素。整个构成一个所谓的:app。app.js是整个应用的入口,用来初始化Ext.Application,当然,你可以不叫app.js,比如叫:aipapa.js,都是可以滴!!但是里面是干这个事情的。。。
</>复制代码
/**
* 设置Extjs的动态加载路径
*/
Ext.Loader.setConfig({
enabled: true,
paths: {
"Ext": "app/vendor/extjs/6.2.0",
"Ext.ux": "app/vendor/extjs/6.2.0/ux"
}
});
/**
* 是否开启url缓存,就是xxx.com?_dc=123123123123类似这种
*/
Ext.Ajax.disableCaching = false;
/**
* 初始化工具提示
*/
Ext.QuickTips.init();
Ext.application({
name: "luter",//这个应用叫啥,其实就是目录名字
/**
* 你把这个应用放哪个目录下了,控制器啊store啊view啥的,在哪里?
* 以后定义一个叫Ext.define("luter.model.Car",{})的时候,其实就是指向了js文件:app/luter/model/Car.js
* requiere就会动态 ajax load这个js下来
*/
appFolder: "app/luter",
init: function () {//先初始化
console.log("init")
}, launch: function () {//发射!
console.log("launch")
}
});
最后,在入口html中记得引入这个文件。不出意外的话预览app.html,console里应该能看到点信息了,当然,依然没啥UI效果....接下来就创建view
开始创建主view主视窗: app/luter/view/main/viewport.js</>复制代码
主view基础是一个viewport,采用Border布局,头部header+底部footer+左侧导航树+中间tab页内容切换。为了方便管理,主view统一放在main目录下,
</>复制代码
/**
* 主视图占满全屏是个viewport
*/
Ext.define("luter.view.main.ViewPort", {
extend: "Ext.Viewport",
alias: "widget.viewport",//别名,与xtype对应
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"],//默认views会寻找项目目录下的view目录,也就是会扫描到app/luter/view了,所以直接下下级路径即可。
stores: [],
init: function (application) {
var me = this;
this.control({
"viewport": {//监听viewport的初始化事件,可以做点其他事情在这里,如有必要,记得viewport定义里的alias么?
"beforerender": function () {
console.log("viewport begin render at:" + new Date());
},
"afterrender": function () {
console.log("viewport render finished at:" + new Date());
},
}
});
}
});
控制器有了,视图有了,接下来让程序显示这个UI,修改app.js
修改app入口: app/luter/app.js</>复制代码
/**
* 设置Extjs的动态加载路径
*/
Ext.Loader.setConfig({
enabled: true,
paths: {
"Ext": "app/vendor/extjs/6.0.0",
"Ext.ux": "app/vendor/extjs/6.0.0/ux"
}
});
/**
* 是否开启url缓存,就是xxx.com?_dc=123123123123类似这种
*/
Ext.Ajax.disableCaching = false;
/**
* 初始化工具提示
*/
Ext.QuickTips.init();
var luterapp;//定义一个全局app对象,便于后续使用
Ext.application({
name: "luter",//这个应用叫啥,其实就是目录名字
/**
* 你把这个应用放哪个目录下了,控制器啊store啊view啥的,在哪里?
* 以后定义一个叫Ext.define("luter.model.Car",{})的时候,其实就是指向了js文件:app/luter/model/Car.js
* requiere就会动态 ajax load这个js下来
*/
appFolder: "app/luter",
init: function () {//先初始化
console.log("init")
}, launch: function () {//发射!
console.log("launch")
luterapp = this;
this.loadModule({
moduleId: "MainController"
});
var module = this.getController("MainController");//加载这个控制器
var viewName = module.views[0];//获取到这个控制器里的第一个view名字
var view = module.getView(viewName);//获取到这个view,本质上就是加载js文件
view.create();//创建这个view
},
/**
* 动态加载控制器
* @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 {
}
}
}
});
这里面用到了一个showFailMesg的函数,这种弹出提示框的东西,可以做成通用的函数放在utils里,后续这个工具类会逐渐完善。
如下:
</>复制代码
/**
* 操作成功提示
*/
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 || ""
});
}
当然,这个js也需要在入口html引入,在app.js之前引入。如下:
修改入口html: app/app.html至此,没什么意外的话,应该是可以看到界面了!</>复制代码
<span class="hljs-selector-tag">EXTJS6</span><span class="hljs-selector-class">.2</span><span class="hljs-selector-class">.0MVC</span>
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/92683.html
摘要:上篇实现了基本的代码架构,控制器动态加载功能以及一个基础的页面布局,本节开始,将陆续完善这个页面。页面底部区域,主要显示版权信息等,也可以显示个时间啥的。。。头部和底部定义完毕后,需要在中引入对应位置。 上篇实现了基本的代码架构,控制器动态加载功能以及一个基础的页面布局,本节开始,将陆续完善这个页面。 目标 如前所述,我们的页面包含这么几个区域: header: UI顶部区域,显示系...
摘要:结构实践三完善基本页面一般经典的后台管理系统,都是左侧菜单右侧结构布局。不免俗,咱也这么实现定义左侧导航菜单新建采用的组件构建一个导航菜单为了显示图标,引入字体图标,在引入引入定义导航菜单数据功能菜单展开节点。 extjs-mvc结构实践(三):完善基本页面2 一般经典的后台管理系统,都是左侧菜单右侧tabs结构布局。不免俗,咱也这么实现! 定义左侧导航菜单 新建:app/luter/...
摘要:今天开始,一点点记录一下使用搭建一个基础结构的过程。没办法,记性差这种结构的前端,主要是面向后台信息管理系统,可以最大限度的规范前端代码结构和数据结构。 今天开始,一点点记录一下使用extjs6.2.0搭建一个基础MVC结构的过程。没办法,记性差:)这种结构的UI前端,主要是面向后台信息管理系统,可以最大限度的规范前端代码结构和数据结构。做网站 或者手机端,这种方式全引入了extjs,...
摘要:根据模块创建模块失败。在中,我们配置了标明了这是一个控制器模块,点击后会去触发控制器加载动作。正常情况下同一个模块的只加载一次。 前面几篇文档,我们基本实现了一个静态的extjs页面,本篇开始,实现左侧导航树与右侧内容的联动,也就是点击导航菜单,加载对应模块页面和业务逻辑,实现js文件的按需加载。 业务需求是这样的: 左侧的treelist,当点击某个节点的时候,系统根据tree数据里...
摘要:而且上一篇文章中,也已经实现了一个基本的用户管理列表页面。接着上一篇,完善用户管理,实现增删改。为了用户体验,增加和修改用户信息的表单,都放在弹窗中进行。 经过前面几篇文章的介绍,一个基本的MVC结构应该是具备了。而且上一篇文章中,也已经实现了一个基本的用户管理列表页面。接着上一篇,完善用户管理,实现增删改。为了用户体验,增加和修改用户信息的表单,都放在弹窗中进行。避免跳转页面。 定义...
阅读 2312·2021-11-25 09:43
阅读 2458·2021-11-24 09:39
阅读 1749·2021-11-22 12:02
阅读 3110·2021-11-17 09:33
阅读 3575·2021-11-15 11:38
阅读 3016·2021-10-13 09:40
阅读 1230·2021-09-22 15:41
阅读 1802·2019-08-30 10:58
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要