OM前端框架说明

om前端框架采用RequireJS,RequireJS  是一个JavaScript模块加载器。它非常适合在浏览器中使用, 它非常适合在浏览器中使用,但它也可以用在其他脚本环境, 就像 Rhino and Node. 使用RequireJS加载模块化脚本将提高代码的加载速度和质量。

RequireJS 的使用

首先在index.html中引用RequireJs,

<script src="js/lib/require.js" data-main="js/main.js"></script>

注意到图中标签中有一个data-main属性,你现在只需要了解require.js会在加载完成以后通过回调方法去加载这个data-main里面的js文件,所以这个js文件被加载的时候,RequireJS已经加载执行完毕。

require.config({
// http://SMStatic.31huiyi.com/js
baseUrl: GLOBAL_CONFIG.SMStaticDomainURL + 'js',
urlArgs: 'v=' + (new Date().getTime()),
waitSeconds: 30,
paths: {
'jquery': 'lib/jquery-2.1.4.min',
'underscore': 'lib/underscore-min',
'backbone': 'lib/backbone-min',
'utils': 'util/utils',
'datatable': 'plugin/datatable/js/datatable',
'lang': 'util/lang-zh_cn',
'validate': 'plugin/jquery.validate.form/js/jquery.validate.form',
'ztree': 'plugin/zTree_v3/js/jquery.ztree.all-3.5.min',
'jqueryui': 'lib/jquery-ui.min',
'printarea': 'plugin/print/jquery.PrintArea',
'autopop': 'app/auto_pop',
'zclip': 'plugin/forms_zclip/jquery.zclip.min', 'calendar': 'app/Ecalendar.jquery.min',
'moment': 'lib/moment',
'bootstrap-datetimepicker': 'lib/datetimepicker',
'newdatetime': 'lib/newdatetime',
'timepicker': 'lib/timepicker_init'
},
shim: {
'validate': {
deps: ['jquery', 'lang']
},
'datatable': {
deps: ['jquery']
},
'ztree': {
deps: ['jquery'],
exports: '$.fn.zTree'
}
}
});
require.onError = function (err) {
console.log(err.requireType);
if (err.requireType === 'timeout') {
console.log('modules: ' + err.requireModules);
} throw err;
}; require(['base/nav']);

在main.js文件,里面被一个匿名立即执行函数所包括。在require.config(...)中,可以配置许多配置项,后面会有详细说明。上面在config中添加了一个path,在path配置了一个模块ID和路径的映射,这样在后续的所有函数中就可以直接通过模块ID来引入依赖,而不用再多次引入依赖多次输入路径带来的麻烦。当然也可以直接引用相对路径。

知道了大概的requirejs的结构。看看项目里具体怎么使用的吧。

那我们就以在om里获取服务云的公司管理的功能为例。

链接是这样 http://om.31huiyi.com/#/om/ServiceManagement/View/CompanyView

显然这样一个路由是我们自定义的,没有#命名的文件夹。

关于这样一个链接是如何找到companyview.js的呢?

答案在于main.js一开始就加载的nav.js里。看下图

define([
'jquery',
'backbone',
'util/router',
'base/BaseView',
'app/menunav'
], function($, Backbone, router, BaseView, menu){
var NavView = BaseView.extend({
el: $('body'),
root: '#/sm',
slideSpeed: 200,
events: {
'click .menu > li.has-sub-menu > span': 'foldMenu',
//'click .menu > li.has-sub-menu > span': 'routeMenu',
'click .menu .sub-menu > li': 'routeMenu'
},
initialize: function() {
menu.init(); Backbone.history.start();
}, foldMenu: function(e){
var $T = $(e.target);
var SlideSpeed = this.slideSpeed;
var $P = $T.parent();
if($P.hasClass('active')){
$('.dy-nav').hide();
$P.removeClass('active'); $P.find('.sub-menu').slideUp(SlideSpeed);
} else {
$('.menu > li.has-sub-menu').removeClass('active');
$('.menu > li.has-sub-menu').find('.sub-menu').slideUp(SlideSpeed) if($P.find('.sub-menu > li.active').length > 0){
$('.dy-nav').show();
}
setTimeout(function(){
menu.reset();
}, SlideSpeed+5); $P.addClass('active');
$P.find('.sub-menu').slideDown(SlideSpeed);
} var url = $T.data('url');
if (url) {
router.navigate(this.root + url, { trigger: true });
}
}, routeMenu: function(e){
var $T = $(e.currentTarget);
var url = $T.data('url');
if(url){
$('.menu .sub-menu > li').removeClass('active');
$T.addClass('active'); var top = $T.offset().top;
var _html = '<div class="loading-view"></div>';
if($('.loading-view').length === 0){
$('body').append(_html);
}
$('.loading-view').css({
display: 'block',
top: top + ($T.height()-$('.loading-view').height())/2
}); router.navigate(this.root+url, {trigger: true});
}
}
}); return new NavView;
});
define([
'jquery',
'backbone',
'app/menunav'
], function ($, Backbone, menu) {
var Router = Backbone.Router.extend({
currentView: null,
root: GLOBAL_CONFIG.CurrentDomainScriptPath,
routes: {
'': 'transmitRouter',
'sm/*path': 'transmitRouter',
'*error': 'error'
}, switchView: function(hash, view){
var curLi = $('.menu').find('[data-url="/'+hash+'"]');
curLi.parents('.has-sub-menu').addClass('active');
curLi.addClass('active');
menu.active(curLi); if(this.currentView){
this.currentView.remove();
}
this.currentView = view;
}, transmitRouter: function(hash){
var _this = this; // DefaultPage变量在Index.cshtml里配置
if (!hash) hash = GLOBAL_CONFIG.DefaultPage;
require([_this.root + hash + '.js'], function (View) {
var view = new View;
_this.switchView(hash, view);
});
}, error: function(){
alert('页面未找到');
$('.loading-view').hide();
}
}); return new Router();
});

定义了root,然后在所有的菜单的链接上都加上root.而在router.navigate这个方法里会找到companyview的绝对地址。

接下来看看companyview的结构是怎样的?

define = function (name, deps, callback)完成的,第一个参数是定义模块名,第二个参数是传入定义模块所需要的依赖,第三个函数则是定义模块的主函数,主函数和require的回调函数一样,同样是在依赖加载完以后再调用执行。通常第一个参数我们会不写,以防我们会转移这个文件的目录,让优化工具自己生产这些模块名。

define([
'jquery',
'base/BaseView',
'app/ztree',
'utils',
'/script/OM/ServiceManagement/Model/CompanyModel.js',
'datatable',
'validate'
], function ($, BaseView, zTree, utils, CompanyModel, DataTable) {
var CompanysView = BaseView.extend({
model: CompanyModel,
url: CompanyModel.initurl,
dt: null,
events: {
'click #SearchByFansName': 'Search',
'click #addCompany': 'addCompany',
'click #searchUserBtn': 'searchUserBtn',
'click #saveModel': 'saveUserCompany' },
outerEvents: {},
initialize: function () {
var _this = this;
this.bindOuterEvent();
this.render({
complete: function () {
_this.initTable();
}
});
});

下面我们讲讲这些参数的具体用法。

Model:在本次项目中我们把Controllers的操作方法的路由存到model里去。便于管理,上面要引用这个路径。

Url:是当前页面的路由。

Dt:初始化为null,如果页面里有列表数据,会在initTable赋值。

Events:就是当前页面触发的事件。

OutEvents:就是公共事件

Initialize: 初始化这个页面执行的方法。

OK,om的前端框架大致就是这样了。

RequireJS简单实用说明的更多相关文章

  1. jQuery的几种简单实用效果

    许久未分享博客,或许已生疏. 闲来无事, 分享几个jQuery简单实用的效果案例 不喜勿喷... 1.页面常用的返回顶部 <!DOCTYPE html> <html lang=&qu ...

  2. 经验分享:10个简单实用的 jQuery 代码片段

    尽管各种 JavaScirpt 框架和库层出不穷,jQuery 仍然是 Web 前端开发中最常用的工具库.今天,向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段. 您可能感兴趣的相 ...

  3. 简单实用的PHP防注入类实例

    这篇文章主要介绍了简单实用的PHP防注入类实例,以两个简单的防注入类为例介绍了PHP防注入的原理与技巧,对网站安全建设来说非常具有实用价值,需要的朋友可以参考下   本文实例讲述了简单实用的PHP防注 ...

  4. php简单实用的操作文件工具类(创建、移动、复制、删除)

    php简单实用好用的文件及文件夹复制函数和工具类(创建.移动.复制.删除) function recurse_copy($src,$dst) {  // 原目录,复制到的目录 $dir = opend ...

  5. 基于Bootstrap简单实用的tags标签插件

    http://www.htmleaf.com/jQuery/ jQuery之家 自由分享jQuery.html5和css3的插件库 基于Bootstrap简单实用的tags标签插件

  6. C#_简单实用的翻页

    简单实用的生成翻页HTML辅助类 C# using System.Text; namespace ClassLibrary { /// <summary> /// /// </sum ...

  7. 简单实用的Windows命令(一)

    前几天新买了一台笔记本电脑,使用了一下几个简单的查看电脑配置的命令,觉得非常的不错,在此记录一下 一:运行命令的方式有两种 1:使用快捷键WIN+R,然后在弹出的“运行”对话框中输入对应的命令 2:在 ...

  8. 简单实用的Windows命令(二)

    昨天简单的记录了几个非常简单实用的Windows命令,不过我又想起来还有两个我在实际的工作中也是经常用到的命令——PING和IPCONFIG,不过我在工作中的使用都是非常简单的,用PING命令检测对应 ...

  9. iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信

    一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...

随机推荐

  1. Ubuntu下 MySql忘记密码解决方案

    1.在终端输入 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 2.在文件内搜索skip-external-locking,在下面添加一行: skip-gran ...

  2. 干掉windows无脑设定:“始终使用选择的程序打开这种文件”、“使用Web服务查找正确的程序”

    先看几张图体会一下: 实在很佩服自己就那样默默忍受了很多很多年.其实这些东西在网上小小的一搜,5分钟就能搞定. 然而我们大家都在想,现在没时间,我还要做xxxx事呢,反正多点两下鼠标而已. 是啊,点两 ...

  3. 在vscode中使用eslint+prettier格式化vue项目代码 (转载)

    ESlint:javascript代码检测工具,可以配置每次保存时格式化js,但每次保存只格式化一点点,你得连续按住Ctrl+S好几次,才格式化好,自行体会~~ vetur:可以格式化html.标准c ...

  4. Shiro权限模型以及权限分配的两种方式

    1. 顶级账户分配权限用户需要被分配相应的权限才可访问相应的资源.权限是对于资源的操作一张许可证.给用户分配资源权限需要将权限的相关信息保存到数据库.这些相关内容包含:用户信息.权限管理.用户分配的权 ...

  5. 区别 chown和chmod的用法

    本人总是习惯使用chmod,而把chown混淆. chown就是修改 第一列内容的 ,chmod是修改 第3,4列内容的. chown用法用来更改某个目录或文件的用户名和用户组的chown 用户名:组 ...

  6. java程序员技术范围

    1 工具 开发工具.源代码管理.构建工具.测试工具(压力.安全等).接口测试工具.反编译工具.日志工具.第三方工具等 2 java jvm.多线程.socket.io(两种方式).集合(两大接口).异 ...

  7. 学习 razor pages 指南

    这是一个系列,我打算把此人的系列翻译一下,学习技术的同时,顺便提高一下英文水平. 原文地址:https://www.learnrazorpages.com/ 前言 欢迎来学习 razor pages ...

  8. 企业面试必会shell

    企业面试题1: 使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件,名称例如为: [root@oldboy oldboy]# sh /serv ...

  9. mysql_config not found和error: command 'gcc' failed with exit status 1

    要想使python可以操作mysql 就需要MySQL-python驱动,它是python 操作mysql必不可少的模块. 下载地址:https://pypi.python.org/pypi/MySQ ...

  10. JS & JQuery 动态处理select option

    原文 出处http://www.51xuediannao.com/html+css/htmlcssjq/cssbuhuanhang.html 今天你问了我一个关于在<select>里动态添 ...