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. further configuration avilable 不见了

    Dynameic Web Module的further configuration avilable  不见了 打开目录下的 org.eclipse.wst.common.project.facet. ...

  2. oracle insert into 插入多组数据方法总结

    网上好多oracle 的文章,多是以oracle开头,内容确实其他sql,一幅气死人不偿命的嘴脸着实让人难受. 今天就更新点oracle 使用insert into插入数据的方式: 1.oracle ...

  3. mac 安装和使用MongoDB

    安装 尝试一:手动命令安装尝试二:采用Homebrew尝试三:下载安装包使用安装尝试一:手动命令安装按照官网https://docs.mongodb.com/manual/tutorial/insta ...

  4. Abd学习笔记

    Abd学习笔记 V快捷键:转正坐标 Tab快捷键:切换xyz或是长度角度 空格键快捷键:切换长度或弧度 Enter快捷键:确定方向x或y O快捷键:做辅助线 E:切换平面,分别有t,f,s Ra:创建 ...

  5. 收藏vue技术内幕

    http://hcysun.me/vue-design/art/7vue-reactive.html#observer-%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0

  6. pycharm远程调试docker容器内程序

    文章链接: https://blog.csdn.net/hanchaobiao/article/details/84069299 参考链接: https://blog.csdn.net/github_ ...

  7. 关于tarjan

    关于Tarjan算法 梗概 tarjan算法有两种(我了解的),一种是用来求强连通分量的,另一种是关于割点和桥的问题. 根据机房大佬HL说过,这两种算法是互相独立的,只是代码很像. 强连通分量问题 关 ...

  8. OpenStack--glance组件镜像服务

    glance介绍 Glance 是 OpenStack 项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找,注册和检索等.Glance 提供 Restful API 可以查询虚拟机镜像的 metad ...

  9. 4.2 Oracle Dataguard failover 操作步骤

    在11g里面,Oracle认为最理想的情况是,虽然Oracle数据库不能打开,但是可以启动到 mount状态.Mount状态之所以重要,就在于如果可以到这个阶段,控制文件control_file就可以 ...

  10. [原创][Synth 8-2543] port connections cannot be mixed ordered and named ["*_Top.v":1151]

    Vivado综合错误: [Synth 8-2543] port connections cannot be mixed ordered and named ["*_Top.v":1 ...