RequireJS簡單實用說明

來源:互聯網
上載者:User

標籤:操作方法   資料   des   bsp   router   else   bootstra   text   display   

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簡單實用說明

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.