extjs html 指向网页,extjs-mvc结构实践(二):基本页面

2023-11-05

接着来,上一篇搭建了基本的项目骨架,到最后,其实啥也没看见。。。

书接上回,开始写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

主view基础是一个viewport,采用Border布局,头部header+底部footer+左侧导航树+中间tab页内容切换。为了方便管理,主view统一放在main目录下,

主视窗: app/luter/view/main/viewport.js

/**

* 主视图占满全屏是个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里,后续这个工具类会逐渐完善。

如下:

通用函数工具类: 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 || ''

});

}

当然,这个js也需要在入口html引入,在app.js之前引入。如下:

修改入口html: app/app.html

EXTJS6.2.0MVC
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

extjs html 指向网页,extjs-mvc结构实践(二):基本页面 的相关文章

  • SQL注入系列之ASP+ACCESS手动注入(一)----数字型

    一 access数据库 1 简介 Microsoft Office Access是由微软发布的关系数据库管理系统 它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点 是 Microsoft Offi
  • 分类模块丨前端uniapp微信小程序项目

    小兔鲜儿 分类模块 用户点击左菜单的一级分类 切换右侧对应的二级分类和商品 准备工作 参考效果 商品分类页中的广告位 可复用之前定义的轮播图组件 XtxSwiper 静态结构 商品分类页静态结构 src pages category cat
  • 拷贝构造(深拷贝、浅拷贝)

    一 概念介绍 拷贝构造 拷贝构造函数 又称构造函数 是一种特殊的构造函数 它由编译器调用来完成一些基于同一类的其他对象的构造及初始化 其唯一的形参必须是引用 但并不限制为const 一般普遍的会加上const限制 在类中如果没有显式给出拷贝
  • avalon.js 转义html,avalon模块的内建适配器

    text bindings 第一个传参将强制转换为字符串 假值为 然后变成目标节点的innerText 今天的天气为 require ready more avalon function var viewModel myMessage ob
  • OpenLayer和JSTS空间相交应用

    getAreaData DrawGeometry level const that this 多边形绘制结束后获取空间几何数据传递 获取边界 const drawExtent DrawGeometry getExtent 实例化jsts c
  • [230517] TPO71

    7102 Minoan Palaces 目录 7102 Minoan Palaces 正文 题目 Paragraph 1 问题 1 Paragraph 2 问题 2 Paragraph 3 问题 3 4 Paragraph 4 问题 5 6
  • 极速搭建Hexo博客【 CentOS7 + Node.js + Hexo + Github Pages】

    Hexo是一款流行的博客框架 基于Node js 支持Markdown语法 这篇文章记录我如何完成搭建并部署到Github Pages上 创建虚拟环境 养成隔离项目环境的好习惯 python3 m venv venv blog 创建虚拟环境
  • 三相三线与三相四线计算公式

    三相三线与三相四线计算公式 项目 计算公式 备注 视在功率 S UI 有功功率 P 3UxIxcos 3ULILcos Ux 相电压 无功功率 Q 3UxIxsin 3ULILsin UL 线电压 功率因数 cos P S P UI 总视在
  • Linux系统开发

    一 实验目的 设计一款携带多种功能的聊天软件 不仅可以聊天 也能修改字体 计时 绘画等等 二 实验内容 1 ui设计 满分15分 2 画图 timer 多线程 满分20分 3 数据库操作 满分15分 4 TCP网络通信 满分40分 客户端1
  • 红队靶场搭建

    这篇博客主要是讲解一下vulstack红队评估的靶场 从信息收集到控制DMZ区域的WEB服务器 接着联合MSF和CS控制内网机器 随后通过搭建隧道 配置代理 攻击内网机器并且控制域控 主要讲解红队的攻击的全部流程 首先主要讲解一下靶场环境的
  • 几个汇编代码

    文章目录 输入输出 输出2 16进制 冒泡排序 判断正数负数零 以有符号数输出 输入输出 DATAS SEGMENT arr dw 20 dup num db 0 string1 db input the number of interge
  • 【Debug】关于Could not get lock /var/lib/dpkg/lock-frontend解决办法

    作者 柒号华仔 个人主页 欢迎访问我的主页 个人信条 星光不问赶路人 岁月不负有心人 个人方向 专注于5G领域 同时兼顾其他网络协议 编解码协议 C C linux等 感兴趣的小伙伴可以关注我 一起交流 目录 现象 原因 解决办法 现象 在
  • 前端js通过ajax请求下载Blob类型文件(XMLHttpRequest)

    方式一 必须通过原生ajax实现 jquery封装的ajax会有问题 function exportDevice params let xhr new XMLHttpRequest xhr open post http localhost
  • LORA项目源码解读

    大模型fineturn技术中类似于核武器的LORA 简单而又高效 其理论基础为 在将通用大模型迁移到具体专业领域时 仅需要对其高维参数的低秩子空间进行更新 基于该朴素的逻辑 LORA降低大模型的fineturn门槛 模型训练时不需要保存原始
  • 地球坐标,火星坐标,百度坐标转换

    标准地球坐标即GPS设备获得的坐标 该坐标需要经过国家测绘局进行加密后形成火星坐标 WGS 84 我们用的google坐标和高德地图坐标也就是火星坐标 百度地图 在火星坐标的基础上再进行一次加密 形成了百度地图上的坐标 因此 直接将标准地球
  • 电脑出现您的计算机配置似乎正确的,Win10提示你的计算机配置似乎是正确的怎么解决?...

    电脑使用久了总是会出现一些问题 最常见的就是系统提示了 相信不少用户都遇到过win10提示你的计算机配置似乎是正确的 但是又不知道怎么办 为此小编赶紧整理了以下教程帮助大家 大家赶紧来看看吧 访问 解决方法 1 首先进入桌面 按下 win
  • echarts自定义仪表盘实现特殊功能:轴线渐变(半透明) + 刻度颜色变化 + 仪表盘轴线宽度自适应

    如图是我画的两个仪表盘 第一个仪表盘 实现了 轴线渐变 半透明 刻度颜色变化 仪表盘轴线宽度自适应 第二个仪表盘 实现了 仪表盘轴线宽度自适应 关于轴线的渐变 本来打算使用img 但是由于此轴线是透明度渐变 不同位置透明度不一样 所以无法使
  • vue定时器无法停止。

    vue模板里面的定时器问题 文章目录 前言 一 定时器是什么 二 使用步骤 1 使用过程 2 读入数据 总结 前言 有些时候我们在使用vue模板时 不免会使用定时器来定时请求后台获取数据 但是在获取数据的时候 定时器就像踩不住刹车的小车 飘
  • Nuxt.js实现SSR的应用

    seo 即 搜索引擎优化 Search Engine Optimization 它是指通过站内优化 如 网站结构调整 网站内容建设 网站代码优化以及站外优化等方法 来进行搜索引擎优化 简单说 通过各种技术 手段 来确保 你的Web内容被搜素

随机推荐

  • 股海心法60条

    看不懂 看不准 没把握时坚决不进场 先学会做空 再学会做多 君子问凶不问吉 高手看盘先看跌 贪婪与恐惧 投资之大忌 侥幸是加大风险的罪魁 犹豫则是错失良机的祸首 心态第一 策略第二 技术只有屈居第三 任何时候不要轻易满仓 这样做 有利于保持
  • MySQL的多表关联查询

    一 多表关联查询 多表关联查询是使用一条SQL语句 将关联的多张表的数据查询出来 1 1 交叉查询 交叉查询就是将多张表的数据没有条件地连接在一起进行展示 1 1 1 语法 使用交叉查询类别和商品 目标 查询所有分类 以及每个分类下的所有商
  • 企业微信开发(通讯录模块)

    1 前言 关于企业微信通讯录同步的开发 先获取企业corpid 通讯录应用的secret 并在通讯录应用开启API编辑通讯录权限 2 关于token token是通过调用微信api接口由corpid和secret获取 由于token是每隔两
  • 系统提示0x00000709错误怎么办?

    一般都是系统自动更新补丁造成的 系统更新出现大面积打印机造成电脑蓝屏的问题还没解决多久 又出现了更新系统造成打印机无法共享 现在的系统都不带测试就推送的吗 所以我一般强烈建议大家不要更新系统 更新系统就是个定时炸弹 随时可能让你的系统爆炸
  • 链式栈的创建以及各种操作

    目录 一 声明 二 链式栈的初始化和各种操作 2 1 链栈结构定义 2 2 初始化和进栈操作 2 3 进栈结果展示 编辑 2 4 出栈操作 2 5 出栈结果展示 2 6 遍历操作 2 7 遍历结果展示 编辑 2 8 获取栈顶元素 2 9 结
  • JS对象

    前言 回顾之前的七种数据类型 number string bool symbol null undefined object 五个falsy值 null undefined 0 NaN 空字符串 对象的概念 定义 无序的数据集合 键值对的集
  • openstack之neutron Local网络

    openstack之neutron Local网络 一 local网络介绍 二 修改neutron的相关配置文件 1 进入配置文件目录 2 备份配置文件 3 修改配置文件 三 重启服务 四 管理员创建local网络 1 创建网络 2 创建子
  • 机器学习西瓜书吃瓜笔记之(一)深入理解线性模型与logistics回归

    入门概念 机器学习两大基本问题 预期的输出是离散还是连续 回归问题 用多个变量拟合出一个连续值 分类问题 用多个变量拟合出一个离散值 机器学习三大理论 确定研究手段 传统监督学习 血糖预测 有无糖尿病预测 深度学习 自然语言处理 计算机视觉
  • hosts文件的作用以及hosts中多个ip映射一个域名地址的解析顺序

    hosts的作用 当我们访问网站时 要首先通过DNS服务器把网络域名 www xx com 解析成IP地址 我们的计算机才能访问 如果对于每个域名请求我们都要等待域名服务器解析后返回IP信息 这样访问网络的效率就会降低 而Hosts文件就能
  • 什么是copyonwrite容器

    开发十年 就只剩下这套Java开发体系了 gt gt gt CopyOnWrite容器即写时复制的容器 通俗的理解是当往一个容器添加元素的时候 不直接往当前容器添加 而是先将当前容器进行Copy 复制出一个新的容器 然后新的容器里添加元素
  • STK的2D二维采用的投影方式及osgEarth实现

    Spherical or Equirectangular projection 等距圆柱投影 球面投影 The equirectangular projection also called the equidistant cylindric
  • 【tkinter学习笔记 - 2】:Entry的使用、Button按钮的使用

    目录 一 Entry单行文本框 代码演示 Button按钮的使用 代码演示 一 Entry单行文本框 Entry用来接收一行字符串的控件 如果用户输入的文字长度长于 Entry 控件的宽度时 文字会自动向后滚动 如果想输入多行文本 需要使用
  • linux系统centos7使用 locate命令 查找文件

    百度找到都是whereis find这种 有时候搜不出来 发现locate非常好用
  • uni-app 设置APP应用跳转到系统设置页

    打开蓝牙设置 var main plus android runtimeMainActivity var Intent plus android importClass android content Intent var mIntent
  • Springboot整合Shiro实现登录认证

    一 概述 Shiro 是一个功能强大且易于使用的轻量级Java安全框架 包括身份验证 授权 加密及会话管理 使用Shiro易于理解的API 可以轻松地保护任何应用程序 二 Shiro主要组成 1 首先主要包括三大实体 Subject Rea
  • 优秀的测试工程师应该具备哪些素质

    人是测试工作中最有价值也是最重要的资源 只有保证测试工程师良好的素质 才能保证测试 产品的质量 然而 在有些公司让那些没有应聘上开发职位的人来做测试 这绝对是错误的 最终会损害企业 为高质高效地完成测试任务 软件测试工程师应具有很好的素质和
  • echarts设置y轴值间隔

    在标签yAxis 中 设置min max splitNumber 例如 min 0 max 1 splitNumber 10 呈现
  • 暴力破解漏洞

    0x01 漏洞描述 暴力破解漏洞 暴力破解的产生是由于服务器端没有做合理的限制 导致攻击者可以通过暴力的手段破解所需信息 如用户名 密码 验证码等 暴力破解的关键在于字典的大小 暴力破解需要一个庞大的字典 如4位数字的验证码 那么暴力破解的
  • MDK软件不能模拟仿真STM32F407的问题解决方法

    以下转载文章有点多 如有侵权请联系我删除哦 https blog csdn net weixin 49093913 article details 125362111 关于Keil MDK 5 仿真STM32F4报错no read perm
  • extjs html 指向网页,extjs-mvc结构实践(二):基本页面

    接着来 上一篇搭建了基本的项目骨架 到最后 其实啥也没看见 书接上回 开始写UI效果 目标 全屏显示 左侧导航菜单 右侧标签页切换操作内容区域 包含header和footer 导航菜单动态ajax产生 点击对应菜单可以动态加载js资源或者数