亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

如何用js 實現依賴注入的思想,后端框架思想搬到前端來

2019-11-20 11:56:13
字體:
來源:轉載
供稿:網友

大家在做些頁面的時候,很多都是用ajax實現的,在顯示的時候有很多表單提交的add或者update操作,顯然這樣很煩,突然想到了一個比較好的方法,下面給大家分享下如何用js 實現依賴注入的思想,后端框架思想搬到前端來。

應用場景: 前后端一一對應、表單內容保存、列表陳述等。

架構思路: 分發器、依賴注入等。

基本代碼陳述:

j.extend({ dispatcher: (function () {  var _route = {},   // default module   _module = {    // 授權    authenticate: true,    // 驗證    validation: true,    // 數據轉換    dataTransform: true,   },   _state = {    error: function () { }   },    _ajax = function () {     j.ajax(this)    }  ;  function _container() {   // initializer.   return _route;  }  function _configuration(config, _tmp_route) {   if (config) {    config.module && (_module = $.extend(_module, config.module))    config.state && (_state = $.extend(_state, config.state))    config.post && config.post.queryString && (function () {     if (!/^/?/.test(config.post.queryString)) {      _tmp_route += "?";     }     _tmp_route += config.post.queryString;    })()    config.list && (function () {     config.list = $.extend({      pageSize: 15,      wrapped: $('#list-container'),      searchForm: $('#form-post'),      searchButton: $('#search-button'),      post: {}     }, config.list);    })()   }   return _tmp_route;  }  return {   ajax: new _container(),   intercept: {    module: function (module) {     $.extend(true, _module, module);    },    route: function (route) {     if (!$.isEmptyObject(_route)) return;      $.extend(true, _route, route);     for (var i in _route) {      if (_route.hasOwnProperty(i)) {       var _controller = _route[i];       for (var k in _controller) {        if (_controller.hasOwnProperty(k) && j.utils.isFunction(_controller[k])) {         (function () {          var clone = j.clone(_controller[k]), _tmp_route = '/' + i + "/" + k;         _controller[k] = function (config) {          var url = _configuration(config, _tmp_route);          if (j.utils.isFunction(clone)) {           clone.apply(_module, config);          }          // todo modules          if (!(_module.authenticate && j.utils.isFunction(_module.authenticate)) && _module.authenticate() || _module.authenticate === true) {           console.log('j.ajax.' + i + "." + k + " authenticate failed.");           config.state.error();           return false;          }          if (config.validation) {           _module.validation.init(config.validation);           config.validation.fireTarget.on('click', function () {            if (!_module.validation || !config.validation.formTarget.valid())             return false;            var data = _module.dataTransform(!config.post.data ? config.validation.formTarget.serializeJson() : config.post.data)            var ajax_data = {             url: url,             data: data,             fireTarget: config.validation.fireTarget            }            ajax_data = $.extend(ajax_data, config.post);            _ajax.call(ajax_data);            return false;           })          }          if (config.list) {           if (!$.fn.pagination) {            throw new Error('j.dispatcher.intercept.list need jQuery.pagination,please load jQuery.pagination before this file.')           }           config.list.onChange = function (pageIndex) {            var $this = this;            this.showLoading();            var formData = config.list.searchForm.serializeJson();            formData.pageIndex = pageIndex;            formData.pageSize = $this.pageSize;            var data = _module.dataTransform(!config.list.post.data ? formData : config.list.post.data)            var ajax_data = {             url: url,             data: data,            }             $.extend(true, ajax_data, config.list.post);            ajax_data.success = function () {             $this.generateData(this.totalRecords, this.list);            }            j.jsonp(ajax_data)           }           j.list.table(config.list);           config.list.searchButton.on('click', function () {            config.list.wrapped.empty();            j.list.table(config.list);           })          }         }         }())        }       }      }     }    }   }  } })()})var global = { dataTransform: {  "default": function () {   if (typeof (arguments[0]) == "object" && Object.prototype.toString.call(arguments[0]).toLowerCase() == "[object object]" && !arguments[0].length) {    return j.json.toKeyValString(arguments[0],true);   }   else if (j.utils.isString(arguments[0])) {    return arguments[0];   }   else {    return {};   }  },  "objectData": function () {   if (typeof (arguments[0]) == "object" && Object.prototype.toString.call(arguments[0]).toLowerCase() == "[object object]" && !arguments[0].length) {    return { data: j.json.toString(arguments[0]) }   }   else if (j.utils.isString(arguments[0])) {    return arguments[0];   }   else {    return {};   }  } }}j.dispatcher.intercept.module({ authenticate: function () { }, validation: (function () {  var hasCongfig = false;  function _config() {   if (!$.fn.validate) {    throw new Error('j.dispatcher.intercept.module.validation need jQuery.validate,please load jQuery.validate before this file.')   }   jQuery.validator.addMethod("isPassword", function (value, element) {    return j.config.reg_phone.test(value);   }, "請輸入6-20密碼建議由數字、字母和符號組成!");   jQuery.validator.addMethod("isMobile", function (value, element) {    return j.config.reg_phone.test(value);   }, "請正確填寫您的手機號碼");   jQuery.validator.addMethod("isEamil", function (value, element) {    return j.config.reg_email.test(value);   }, "請填寫正確的郵箱地址");   jQuery.validator.addMethod("isUserName", function (value, element) {    return j.config.reg_login_name.test(value);   }, "4-32位字符.支持漢字、字母、數字/"-/"/"_/"組合");  }  function _getRequired(parms, filters) {   if (parms instanceof jQuery && parms.length > 0 && parms[0].tagName == 'FORM') {    var config = {};    parms.find('[name]').each(function () {     if (!filters || filters.indexOf(this.name) == -1) {      config[this.name] = { required: true };     }    })    return config;   }   else {    for (var i in parms) {     if (parms[i]) {      parms[i]['required'] = true;     }     else {      parms[i] = { required: true };     }    }    return parms;   }  }  function _getMessage(parms, filters) {   if (parms instanceof jQuery && parms.length > 0 && parms[0].tagName == 'FORM') {    var config = {};    parms.find('[name]').each(function () {     if (!filters || filters.indexOf(this.name) == -1) {      config[this.name] = { required: $(this).attr("data-required-message") };     }    })    return config;   }  }  function _init(config) {   if (!hasCongfig) {    hasCongfig = true;    _config();   }   !config.formTarget && $('#form-post').length > 0 && (config.formTarget = $('#form-post'))   !config.fireTarget && $('#post-button').length > 0 && (config.fireTarget = $('#post-button'))   if (!(config.fireTarget && config.fireTarget instanceof jQuery && config.fireTarget[0].type.toUpperCase() == 'SUBMIT'))    throw new Error("j.validator.init needs config.submitTarget param, its type is submit");   if (!(config.formTarget && config.formTarget instanceof jQuery && config.formTarget[0].tagName == 'FORM'))    throw new Error("j.validator.init needs config.formTarget param, its type is form");   var rules = _getRequired(config.formTarget, config.filters), messages = _getMessage(config.formTarget, config.filters);   config.rulesCallBack && config.rulesCallBack(rules);   config.messagesCallBack && config.messagesCallBack(messages);   config.formTarget.validate({    debug: true,    rules: rules,    messages: messages   });  }  return {   init: function (config) {    _init(config);   },   validate: function () {    return config.formTarget.valid();   }  } })(), dataTransform: global.dataTransform.objectData})j.dispatcher.intercept.route({ passport: {  signin: function () {   this.dataTransform = global.dataTransform.default;  },  signout: function () { },  reg: function () { },  cpwd: function () {   this.dataTransform = global.dataTransform.default;  } }, company: {  save: function () { },  getList: function () { } }, account: {  save: function () { },  saveProfile: function () { },  getList: function () {  } }, partnership: {  signup: function () {  },  getList: function () { } }, venue: {  getList: function () {  save: function () { }, }, show: {  save: function () { }, }});

比如list使用:

j.dispatcher.ajax.account.getList({ list: {  header: ['編號', '用戶名', '賬戶類型', '公司類型', '注冊時間', '最后登錄時間', '是否啟用', '操作'],  rowField: ['AccountCode', 'AccountName', 'AccountType', 'CompanyType', 'RegisterTime', 'LastActivityTime', 'IsAvailable', function (item) {   var html = '<a href="/account/sub?type=edit&id=' + item.Id + '" class="k-table-icon fa-edit mr15" title="編輯信息" ></a>'      + '<a href="javascript:;" class="k-table-icon fa-trash" title="刪除賬戶" onclick="operate(this,/'delete/',{ id : /'' + item.Id + '/' })"></a>'   ;   return html;  }],  formatColumn: function (item, data) {   if (item.IsAvailable != undefined) {    if (item.IsAvailable == true) {     return '<a href="javascript:;" onclick="operate(this,/'set/',{ id : /'' + data.Id + '/',isEnable : 0 })" class="k-table-icon glyphicon glyphicon-ok-circle" title="已啟用"></a>';    }    else     return '<a href="javascript:;" onclick="operate(this,/'set/',{ id : /'' + data.Id + '/',isEnable : 1 })" class="k-table-icon c-error glyphicon glyphicon-ban-circle" title="已禁用"></a>';   }   else if (item.LastActivityTime) {    var now = moment(item.LastActivityTime);    return now.format('YYYY-MM-DD HH:mm:SS');   }   else if (item.RegisterTime) {    var now = moment(item.RegisterTime);    return now.format('YYYY-MM-DD HH:mm:SS');   }  },  rowClick: function () {   window.location = '/account/detail?accountName=' + encodeURIComponent(this.AccountName);  } }})

效果圖:

 


比如表單內容保存,那就更簡單了:

j.dispatcher.ajax.company.save({
  validation: {
    rulesCallBack: function (rules) {
      rules.Name.remote = {
        url: '/handler/validation.ashx?type=cn',
        type: "post", //提交方式
        data: {
          CompanyName: function () {
            return encodeURIComponent($("#Name").val()); //編碼數據
          }
        }
      }
      rules.ConfirmParssword.equalTo = "#Password";
      rules.AccountName.remote = {
        url: '/handler/validation.ashx?type=an',
        type: "post", //提交方式
        data: {
          AccountName: function () {
            return encodeURIComponent($("#AccountName").val()); //編碼數據
          }
        }
      }
    },
    messagesCallBack: function (messages) {
      messages.Name.remote = '該公司已經被注冊!';
      messages.AccountName.remote = '該用戶名已經存在!';
      messages.ConfirmParssword.equalTo = '兩次密碼不一致';
    },
    filters: ['Cellphone', 'Email']
  },
  post: {
    success: function () {
      alert(this.message);
      window.location ='/company/list';
    }
  }
});
后端:后端其實很簡單類,只要有這樣分發器的實現地址就可以了,比如上面的:/company/save

PS: 前端管理框架我是用于基于bootsrap的一個后臺框架.

 

有同學問,js什么什么,這個只是自己封裝的一個js庫,后續會跟大家分享

以上內容就是本文的全部敘述,希望對大家有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国内精品视频| 国产自产女人91一区在线观看| 精品国产精品三级精品av网址| 欧美日韩国产影院| 色偷偷av亚洲男人的天堂| 精品视频—区二区三区免费| 欧美专区日韩视频| 国产成人免费av电影| 日韩网站免费观看高清| 国产999精品| 亚洲精品久久7777777| 日本精品久久中文字幕佐佐木| 日韩欧美福利视频| 欧美成人激情视频| 国产精品一区二区久久久久| 亚洲人成网站在线播| 国产精品稀缺呦系列在线| 精品国产欧美一区二区三区成人| 国产精品久久久久久久av大片| 亚洲第一国产精品| 国产高清在线不卡| 久久久久久欧美| 欧美中文字幕在线播放| 久久av在线播放| 欧美在线视频观看免费网站| 欧美日韩免费在线观看| 亚洲国产高清高潮精品美女| 亚洲成人xxx| 色偷偷av亚洲男人的天堂| 欧美激情精品久久久久久免费印度| 日韩欧美在线视频日韩欧美在线视频| 日本韩国欧美精品大片卡二| 欧美视频在线免费| 欧美另类99xxxxx| 欧美另类极品videosbestfree| 欧日韩在线观看| 欧美伦理91i| 亚洲精品国产精品乱码不99按摩| 粉嫩av一区二区三区免费野| 国产精品福利在线| 亚洲国产成人精品女人久久久| 91免费国产视频| 久久精品久久久久久国产 免费| 日韩精品一区二区三区第95| 欧美另类69精品久久久久9999| 8090成年在线看片午夜| 欧美性xxxxx极品娇小| 91在线高清免费观看| 欧美亚洲国产成人精品| 国产不卡在线观看| 久久久久久欧美| 亚洲成在人线av| 午夜精品一区二区三区在线播放| 亚洲精品一二区| 精品国产依人香蕉在线精品| 欧美一区二区三区……| 欧美性生交xxxxxdddd| 国产精品一区二区三区成人| 欧美老女人在线视频| 欧美午夜精品久久久久久久| 欧美人与性动交| 久久久91精品国产| 亚洲无限av看| 国产欧美在线视频| 日韩视频免费看| 久久亚洲国产精品| 久久久久日韩精品久久久男男| 97精品一区二区视频在线观看| 国产主播在线一区| 欧美视频一区二区三区…| 久久久久国产精品免费| 成人欧美一区二区三区黑人| www.99久久热国产日韩欧美.com| 日本精品视频在线观看| 亚洲国产精品久久久久秋霞不卡| 日韩精品视频观看| 中文字幕日韩精品在线观看| 视频在线一区二区| 一区二区成人av| 一区二区三区美女xx视频| 国产精品96久久久久久| 欧美激情xxxx性bbbb| 成人激情综合网| 久久久www成人免费精品| 最近2019年好看中文字幕视频| 欧美成人精品在线播放| 久久夜色精品亚洲噜噜国产mv| 亚洲已满18点击进入在线看片| 国产成人综合一区二区三区| 亚洲韩国青草视频| 亚洲国产精品99久久| 国产精品久久77777| 亚洲天堂av在线免费| 亚洲人成在线观看| 欧美第一黄色网| 一本色道久久88精品综合| 伊人久久久久久久久久久| 中文字幕一区日韩电影| 一个色综合导航| 欧美午夜激情小视频| 色婷婷综合成人av| 国产精品成av人在线视午夜片| 欧美日韩xxxxx| 国产精品欧美风情| 亚洲精品小视频| 日韩中文字幕在线播放| 国产亚洲人成网站在线观看| 国产精品网站视频| 黑丝美女久久久| 综合网日日天干夜夜久久| 亚洲精品电影久久久| 69av在线视频| 国产国语videosex另类| 91精品国产一区| 亚洲一区二区久久久| 国产99久久精品一区二区| 日韩av在线天堂网| 亚洲一区二区三区在线视频| 亚洲乱码国产乱码精品精天堂| 8090理伦午夜在线电影| 日韩精品在线私人| 国产成人精品亚洲精品| 久久久久久久一区二区三区| 疯狂做受xxxx高潮欧美日本| 69国产精品成人在线播放| 日韩有码在线视频| 精品一区电影国产| 久久久久久久久久久av| 中文字幕日韩在线播放| 97精品免费视频| 一区二区三区视频免费在线观看| 两个人的视频www国产精品| 亚洲免费中文字幕| 国产精品久久久久久久av电影| 欧美一级在线播放| 欧美国产日韩一区二区三区| 亚洲精品电影在线| 91精品国产高清自在线看超| 亚洲欧美国产制服动漫| 91精品视频一区| 亚洲第一福利视频| 中文字幕亚洲欧美一区二区三区| 欧美极品在线播放| 亚洲福利视频网| 中文字幕亚洲情99在线| 国产亚洲精品va在线观看| 国内偷自视频区视频综合| 国产精品中文久久久久久久| 国产亚洲欧洲黄色| 亚洲人午夜精品免费| 国产欧美日韩精品专区| 成人激情视频网| 亚洲成在人线av| 国模精品一区二区三区色天香| 久久久免费观看视频| 91精品久久久久久久久| 一区二区中文字幕| 欧美乱人伦中文字幕在线| 欧美—级高清免费播放| 欧美成人黑人xx视频免费观看| 国产美女主播一区| 伊人久久免费视频| 欧美大胆a视频| 亚洲国产日韩一区|