extjs后自己写了一些见不得人的脚本
<html> <head> <title> 配置管理器 </title> <style type="text/css"> html, body { font-family: Arial; font-size: 14px; } .fieldlabel { float: left; } .fieldtext { float: left; } .combobox { float: left; } .combobox.picker { position: relative; width: 100%; height: 0px; } .combobox.picker .option { height: 24px; border: 1px solid #ddd; line-height: 24px; text-indent: 10px; text-align: left; width: 100%; cursor: pointer; background-color: #efd; } .combobox.picker .option:hover { background-color: #ff0; } .combobox.picker .option.select { background-color: #ff0; } .combotext { float: left; } .grid { width: 100%; float: left; } .grid table { width: 100%; } .grid thead tr { background-color: #3fc; color: #fff; font-weight: bold; } .grid tbody tr { cursor: pointer; } .grid tbody tr:hover { background-color: #ff0; } .grid tbody tr.select { background-color: #ff0; } .container { position: relative; } .container .left { position: relative; left: 0px; } .container .top { position: relative; top: 0px; } .container .right { position: relative; right: 0px; } .container .bottom { position: relative; bottom: 0px; } .container .center { position: relative; } </style> <script src="~/Scripts/jquery-1.8.2.min.js"></script> <script type="text/javascript"> var layer = null; var Wiu = { define: function (name, obj) { var win = window; var names = name.split('.'); names.forEach(function (name, index) { if (index + 1 == names.length) win = win[name] = obj || win[name] || {}; else win = win[name] = win[name] || {}; }) }, getObj: function (name) { var win = window; name && name.split('.').forEach(function (name) { win = win[name]; }); return win; }, apply: function (obj, com) { for (var i in com) { obj[i] = com[i]; } return obj; }, create: function (name, vm) { var obj = Wiu.getObj(name); Wiu.apply(obj, vm); var event = Wiu.getObj(obj.extend); return new event(obj); }, Ajax: { request: function (obj) { $.ajax({ url: obj.api, type: obj.type || 'post', dataType: 'json', data: obj.params, async: obj.async || true, success: function (result) { if (result.IsSuccess) { obj.success(result); } else if (result.ErrCode == '1001') { alert('login'); } else { alert(result.ErrMsg); } } }); } }, Array: { removeAt: function (array, index) { return array.slice(0, index).concat(array.slice(index + 1, array.length)); }, remove: function (array, item) { return array.filter(function (arr) { return arr != item; }); }, select: function (array, fn) { var result = []; array.forEach(function (arr) { result.push(fn(arr)); }); return result; }, find: function (array, fn) { for (var i = 0; i < array.length; i++) if (fn(array[i])) return array[i]; } }, Data: { _modelid: 1, _storeid: 1, _viewmodelid: 1, Model: function (obj) { var data = obj; var model = { data: obj, dirty: false, id: 'wiu_model_' + (Wiu.Data._modelid++), changeStatus: function () { this.dirty = this.data != data; }, change: function (data) { this.data = data; this.changeStatus(); this.onchange(); }, get: function (field) { return this.data[field]; }, set: function (field, value) { this.data[field] = value; this.changeStatus(); this.onchange(); }, reset: function () { this.change(data); }, onchange: function () { } }; return model; }, Proxy: function (obj) { return Wiu.apply({ page: 1, size: 10, outParams: {}, recordCount: 0 }, obj); }, Store: function (obj) { var me = this, loadModel = function (item) { return new Wiu.Data.Model(item); } var store = { id: 'store_' + (Wiu.Data._storeid++), items: [], ispage: obj.ispage === true, updateRecords: [], add: function (item) { var me = this; if (item instanceof Wiu.Data.Model) { me.updateRecords.push({ type: 'create', data: item }); me.items.push(item); } else { me.items.concat(item); item.forEach(function (item) { me.updateRecords.push({ type: 'create', data: item }); }); } me.datachange(); }, complete: function () { }, datachange: function () { }, proxy: obj.proxy ? Wiu.Data.Proxy(obj.proxy) : null, load: function (params) { var me = this; if (!me.proxy) return me.complete(); Wiu.apply(me.proxy, Wiu.apply({ params: params }, Wiu.apply(me.proxy.outParams, me.ispage ? {} : { page: me.proxy.page, size: me.proxy.size }))); Wiu.Ajax.request(me.proxy); }, loadPage: function (page, params) { this.proxy.page = page; this.load(params); }, modify: function (model) { var me = this; for (var i in me.items) { if (com.id === me.items[i].id) { com.change(item.data); me.datachange(); return; } } }, getdata: function () { var me = this; return me.items.filter(function (item) { var res = true; me.filters.forEach(function (filter) { res = res && filter(item); }) return res; }) }, remove: function (item) { Wiu.Array.remove(this.items, item); this.datachange(); }, removeAt: function (index) { Wiu.Array.removeAt(this.items, index); this.datachange(); }, filters: [], filter: function (fn) { this.filters.push(fn); this.datachange(); }, clearfilter: function () { this.filters = []; this.datachange(); }, removeByFn: function (fn) { this.items = this.items.filter(fn); this.datachange(); }, status: 'init', success: function (result) { var me = this; me.items = Wiu.Array.select(result, loadModel); me.datachange(); me.status = 'complete'; me.complete(); } }; if (obj.proxy) store.proxy.success = function (result) { var me = this; me.recordCount = result.RowCount || result.Result.length; store.success(result.Result); } else store.items = Wiu.Array.select(obj.items, loadModel); return store; }, ViewModel: function (obj) { var vm = { id: 'wiu_viewmodel_' + (Wiu.Data._viewmodelid++), change: {}, data: {}, event: {}, stores: {}, bind: function (field, value) { this.data[field] = value; }, get: function (field) { return this.data[field]; }, getStore: function (name) { return this.stores[name]; }, set: function (field, value) { this.data[field] = value; this.change[field] && this.change[field](value); } } Wiu.apply(vm, obj); return vm; } }, ComponentManager: { id: 1, data: [], register: function (obj) { obj.id = 'component_' + Wiu.ComponentManager.id++; obj.el.attr('id', obj.id); this.data.push(obj); }, getCmp: function (id) { return Wiu.Array.find(this.data, function (item) { return item.id === id; }); } }, Component: { event: { getBind: function (field, obj) { return obj.component.bind && obj.component.bind[field] ? obj.viewmodel.get(obj.component.bind[field]) : obj.component[field]; }, setBind: function (obj) { var me = this; return; if (!obj.component.bind) return; for (var i in obj.component.bind) { switch (i) { case 'text': me.bindFieldLabel(obj.el, obj.component, obj.viewmodel); break; case 'value': me.bindTextValue(obj.el, obj.component, obj.viewmodel); break; } } }, bindTextValue: function (dom, obj, vm) { var input = dom.find('input'); input.change(function () { vm.set(obj.bind.value, $(this).val()); }); vm.change[obj.bind.value] = function (val) { input.val(val); }; }, bindFieldLabel: function (dom, obj, vm) { var text = dom.find('.fieldlabel'); vm.change[obj.bind.text] = function (val) { text.html(val + ':'); } }, getStyle: function (obj) { var style = ''; for (var i in obj.style) { style += i + ':' + obj.style[i] + ';'; } return style; }, getStore: function (obj) { return obj.store ? typeof obj.store == 'string' ? Wiu.create(obj.store) : obj.store : (typeof obj.viewmodel == 'string' ? Wiu.create(obj.viewmodel) : obj.viewmodel).getStore(obj.bind.store) }, getViewModel: function (obj) { return typeof obj.viewmodel == 'string' ? Wiu.create(obj.viewmodel) : obj.viewmodel; } }, bar: function (obj) { var me = this, event = Wiu.Component.event, vm = event.getViewModel(obj), bar = $('<div class="toolbar" style="' + event.getStyle(obj) + '"></div>') obj.items.forEach(function (item) { item.viewmodel = vm; Wiu.Component.create(item).render(bar); }); me.component = obj; me.el = bar; me.render = function (obj) { bar.appendTo(obj); } return me; }, button: function (obj) { var me = this, event = Wiu.Component.event, vm = event.getViewModel(obj), button = { xtype: 'button', viewmodel: vm, component: obj, getView: function () { return this.component; }, getViewModel: function () { return this.viewmodel; }, render: function (obj) { this.el.appendTo(obj); } }, temp = '<div class="button" style="' + event.getStyle(obj) + '">' + event.getBind('value', button, vm) + '</div>'; button.el = $(temp); me.render = function (obj) { me.el.appendTo(obj); } button.el.click(function (oEvent) { var e = oEvent || window.event; vm.event[obj.handler](e.srcElement, vm); }); Wiu.ComponentManager.register(button); Wiu.apply(me, button); return me; }, combobox: function (obj) { var event = Wiu.Component.event; var combobox = { xtype: 'combobox', text: [], value: [], viewmodel: event.getViewModel(obj), component: obj, el: null, clear: function () { me.value = []; me.text = []; input.val(''); }, status:false, store: event.getStore(obj), deselect: function (item) { var items = item.slice ? item : [item]; this.el.find('.option').each(function (index, el) { if (el.hasClass('select') && Wiu.Array.find(items, function (item) { return item.id === el.attr('id'); }) != null) { el.click(); } }); }, init: function () { var me = this, temp = '<div class="combobox"><div class="fieldlabel">' + event.getBind('text', combobox) + ':</div><div class="combotext"><input type="text" ><div class="combobox picker hidden"></div></div></div>'; me.el = $(temp); me.store.complete = function () { me.createPicker(this.items); }; me.el.find('input').focus(function () { if (me.status) return; me.store.load(); layer = me.el.find('.picker'); layer.removeClass('hidden'); me.status = true; }); }, select: function (item) { var me = this; var items = item.slice ? item : [item]; me.el.find('.option').each(function (index, el) { if (!el.hasClass('select') && Wiu.Array.find(items, function (item) { return item.id === el.attr('id'); }) != null) { el.click(); } }) }, createPicker: function (items) { var me = this, input = me.el.find('input'), picker = me.el.find('.picker'); picker.html(''); items.forEach(function (item) { var option = $('<div id="' + item.id + '" class="combobox option" >' + item.get(obj.fieldText) + '</div>'); option.click(function () { var el = $(this), val = item.get(obj.fieldValue), index = me.value.indexOf(val); if (index < 0) { me.value.push(val); me.text.push(item.get(obj.fieldText)); el.addClass('select'); } else { me.value = Wiu.Array.removeAt(me.value, index); me.text = Wiu.Array.removeAt(me.text, index); el.removeClass('select'); } input.val(me.text.join(',')); }); picker.append(option); }); }, render: function (obj) { this.el.appendTo(obj); } } combobox.init(); event.setBind(combobox); Wiu.ComponentManager.register(combobox); Wiu.apply(this, combobox); return this; }, container: function (obj) { var me = this, event = Wiu.Component.event, vm = event.getViewModel(obj), temp = '<div class="container" style="' + event.getStyle(obj) + '"></div>'; var container = $(temp); obj.items.forEach(function (item) { item.viewmodel = vm; var com = Wiu.Component.create(item); com.el.addClass(item.region); com.render(container); }); event.setBind(container, obj, vm); me.component = obj; em.el = container; return me; }, create: function (obj) { var me = this; switch (obj.xtype) { case 'label': return me.label(obj); case 'combobox': return me.combobox(obj); case 'button': return me.button(obj); case 'textfield': return me.textfield(obj); case 'grid': return me.grid(obj); } }, form: function (obj) { var me = this, event = Wiu.Component.event, vm = event.getViewModel(obj), temp = '<div class="form" style="' + event.getStyle(obj) + '"><table><tbody></tbody></table></div>'; var form = $(temp), tbody = form.find('tbody'), row = $('<tr></tr>'), i = 0, j = 0; for (; i < obj.items.length; i++, j += obj.items[i].colspan || 1) { var cell = $('<td colspan=' + (obj.items[i].colspan || 1) + '></td>'); obj.items[i].viewmodel = vm; var com = Wiu.Component.create(obj.items[i]); com.render(cell); cell.appendTo(row); if (obj.cols && j > obj.cols) { j = 0; tbody.append(row); row = $('<tr></tr>'); } } if (j > 0) { obj.cols && row.append($('<td colspan=' + (obj.cols - j) + '></td>')); tbody.append(row); } me.component = obj; if (obj.buttons) { Wiu.Component.bar({ items: obj.buttons, viewmodel: vm }).render(form); } me.render = function (obj) { form.appendTo(obj); } me.el = form; return me; }, grid: function (obj) { var me = this, event = Wiu.Component.event, vm = event.getViewModel(obj), temp = '<div class="grid" style="' + event.getStyle(obj) + '"></div>', store = event.getStore(obj, vm); var container = $(temp), grid = $('<table><thead><tr>' + Wiu.Array.select(obj.columns, function (col) { return '<th style="' + event.getStyle(col) + '">' + col.text + '</th>'; }).join('') + '</tr></thead><tbody></tbody></table>'); if (obj.tbar) { Wiu.Component.bar({ items: obj.tbar, viewmodel: vm }).render(container); } grid.appendTo(container); me.store = store; me.initData = function (items) { var tbody = grid.find('tbody'); tbody.find('tr').remove(); items.forEach(function (item) { var row = $('<tr>' + Wiu.Array.select(obj.columns, function (col) { return '<td style="' + event.getStyle(col) + '"><div bind="' + col.bind + '" >' + item.get(col.bind) + '</div></td>'; }).join('') + '</tr>'); item.onchange = function (field, value) { row.find('div[bind="' + field + '"]').html(value); }; tbody.append(row); row.click(function () { var el = $(this); me.select(el, item); }); }); }; me.selection = []; var bindSelect = obj.bind['selection'] || false; me.select = function (el, item) { if (el.hasClass('select')) { me.selection = Wiu.Array.remove(me.selection, item); el.removeClass('select'); } else { me.selection.push(item); el.addClass('select'); } bindSelect && vm.set(bindSelect, me.selection); } event.setBind(obj); store.complete = function () { me.initData(store.getdata()); }; me.component = obj; me.el = container; me.viewmodel = vm; if (obj.page) { me.pagebar(me, store); } if (obj.bbar) { Wiu.Component.bar({ items: obj.bbar, viewmodel: vm }).render(container); } me.render = function (obj) { container.appendTo(obj); } store.load(); return me; }, label: function (obj) { var event = Wiu.Component.event; var label = { xtype: 'label', component: obj, viewmodel: event.getViewModel(obj), el: null, render: function (obj) { this.el.appendTo(obj); } }; var temp = '<div class="label" style="' + event.getStyle(obj) + '">' + event.getBind('text', label) + '</div>'; label.el = $(temp) event.setBind(label); Wiu.ComponentManager.register(label); Wiu.apply(this, label); return this; }, markstar: function (obj) { var me = this, remark = obj.remark || 1, imgOn = '<img src="~/Images/star-on.png" />', imgOff = '<img src="~/Images/star-off.png" />', getStarHtml = function (remark) { var html = ''; for (var i = 0; i < obj.changed ? 5 : remark; i++) { html += remark > i ? imgOn : imgOff; } return html; }, html = '<div style="width:100%;float:left;margin-top:5px;"><label style="float:left; font-size:13px;">' + title + ':</label><div style="float:left;">' + getStarHtml(remark) + '</div></div><br/>', markstar = $(html); markstar.appendTo(container); if (!obj.changed) return; var imgs = markstar.find('img'); imgs.mouseover(function (obj) { var mark = false; imgs.each(function (index, el) { el.src = mark ? imgOff : imgOn; mark = mark || el == obj.target; }); }) imgs.mouseout(function (obj) { imgs.each(function (index, el) { el.src = index < remark ? imgOn : imgOff; }); }) imgs.click(function (obj) { imgs.each(function (index, el) { if (el == obj.target) { remark = index + 1; obj.fn && obj.fn(remark); } }) }) me.render = function (obj) { markstar.appendTo(obj); } me.component = obj; me.el = markstar; }, pagebar: function (grid) { var me = this, store = grid.store, proxy = store.proxy || { page: 1, size: 10, recordCount: 0 }; var plugin = { sizeconfigs: [10, 20, 50, 100, 1000], tpl: '<div class="pagebar"><div>每页</div><div><select>{size}</select></div><div>条</div><div class="split"></div><div class="handler" action="first">《</div><div class="handler" action="last"><</div><div class="split"></div><div>第</div><div><input type="text" action="page" value="{page}" /></div><div>页</div><div>共{pageCount}页</div><div class="split"></div><div class="handler" action="next">></div><div class="handler" action="end">》</div><div class="split"></div><div class="count"><div class="record">显示{recordStart}-{recordEnd}</div><div show="count">共{recordCount}条</div></div></div>', page: proxy.page, size: proxy.size, pageCount: 1, recordCount: 0, recordStart: 0, recordEnd: 0, view: grid.el, countPageRange: function () { var me = this; me.pageCount = Math.ceil(me.recordCount / me.size); var recordEnd = me.page * me.size; me.recordStart = recordEnd > 0 ? recordEnd - me.size + 1 : 0; me.recordEnd = recordEnd < me.recordCount ? recordEnd : me.recordCount; }, createPageBar: function () { var me = this, tpl = me.tpl; me.countPageRange(); //grid.el.find('.pagebar').remove(); var option = ''; me.sizeconfigs.forEach(function (item) { option += '<option ' + (me.size == item ? 'selected' : '') + ' value="' + item + '">' + item + '</option>'; }); tpl = tpl.replace('{size}', option); tpl = tpl.replace('{page}', me.page); tpl = tpl.replace('{pageCount}', me.pageCount); tpl = tpl.replace('{recordStart}', me.recordStart); tpl = tpl.replace('{recordEnd}', me.recordEnd); tpl = tpl.replace('{recordCount}', me.recordCount); var bar = $(tpl); bar.find('.handler').click(function () { var action = $(this).attr('action'); var nowPage = me.page; if (action == 'first') { me.page = 1; } else if (action == 'last') { me.page = me.page - 1 || 1; } else if (action == 'next') { me.page = me.page < me.pageCount ? me.page + 1 : me.page; } else { me.page = me.pageCount; } if (nowPage != me.page) { me.init(); } }); bar.find('input').change(function () { var el = $(this), value = el.val(); me.page = value; me.init(); }); bar.find('select').change(function () { var el = $(this), value = el.val(); me.size = value; me.init(); }); var oldBar = me.view.find('.pagebar'); if (oldBar.length > 0) { me.view[0].replaceChild(bar[0], oldBar[0]); } else { me.view.append(bar); } }, init: function () { proxy.page = me.page; proxy.size = me.size; store.load(); } }; Wiu.apply(plugin, proxy); store.complete = function () { plugin.recordCount = proxy.recordCount; plugin.createPageBar(); if (store.proxy) { grid.initData(store.items); } else { grid.initData(store.items.slice(plugin.recordStart, plugin.recordEnd)); } } plugin.createPageBar(); }, textfield: function (obj) { var me = this, event = Wiu.Component.event, textfield = { xtype: 'textfield', viewmodel: event.getViewModel(obj), component: obj, el: null, getView: function () { return this.component; }, getViewModel: function () { return this.viewmodel; }, render: function (obj) { this.el.appendTo(obj); } }; var temp = '<div class="textfield" style="' + event.getStyle(textfield.component) + '"><div class="fieldlabel">' + event.getBind('text', textfield) + ':</div><div class="fieldtext"><input type="text" value="' + event.getBind('value', textfield) + '"></input></div></div>'; textfield.el = $(temp); event.setBind(textfield); if (obj.bind) { if (obj.bind.value) { var input = textfield.el.find('input'); input.change(function () { textfield.viewmodel.bind(obj.bind.value, $(this).val()); }); textfield.viewmodel.change[obj.bind.value] = function (val) { input.val(val); }; } if (obj.bind.text) { var text = textfield.el.find('fieldlabel'); textfield.viewmodel.change[obj.bind.text] = function (val) { text.html(val + ':'); }; } } Wiu.ComponentManager.register(textfield); Wiu.apply(this, textfield); return this; }, window: function (obj) { var me = this, event = Wiu.Component.event, vm = event.getViewModel(obj), temp = '<div class="window" style="' + event.getStyle(obj) + '"><div class="window_title">' + event.getBind('title', obj) + '</div></div>'; var container = $(temp); obj.items.forEach(function (item) { var com = Wiu.Component.create(item, vm); com.el.addClass(item.region); com.render(container); }); event.setBind(container, obj, vm); me.component = obj; me.el = container; me.show = function () { me.el.css({ 'display': 'block' }) } me.close = function () { me.el.css({ 'display': 'none' }) } return me; } } }; Wiu.define('Web.Store.QueryList', { extend: 'Wiu.Data.Store', proxy: { api: '/Config/getquerylist' } }); Wiu.define('Web.Store.Combo', { extend: 'Wiu.Data.Store', items: [ { text: 'a', value: 1 }, { text: 'b', value: 2 }, { text: 'c', value: 3 }, { text: 'd', value: 4 } ] }); Wiu.define('Web.ViewModel.QueryList', { extend: 'Wiu.Data.ViewModel', data: { name: '测试', value: 'Hello World', text: '下拉框', selection: [] }, stores: { data: Wiu.create('Web.Store.Combo'), store: Wiu.create('Web.Store.QueryList') }, event: { Add: function (el, vm) { alert(vm.get('value')); }, ConfigQuery: function (el) { }, ConfigReport: function (el) { }, ConfigOperation: function (el) { }, Delete: function (el) { } } }) window.onload = function () { $('body').click(function () { var e = window.event; if (layer && layer.find(e.target).length==0) { layer.addClass('hidden'); } }) Wiu.Component.grid({ tbar: [{ xtype: 'textfield', bind: { text: 'name', value: 'value' } }, { xtype: 'combobox', fieldText: 'text', fieldValue: 'value', bind: { text: 'text', store: 'data' } }], columns: [ { text: '值', bind: 'Id' }, { text: '名称', bind: 'Name' }, { text: '位置', bind: 'Position' } ], viewmodel: 'Web.ViewModel.QueryList', page: true, bbar: [ { xtype: 'button', value: '新增', handler: 'Add' }, { xtype: 'button', value: '配置查询', handler: 'ConfigQuery' }, { xtype: 'button', value: '配置列表', handler: 'ConfigList' }, { xtype: 'button', value: '配置功能', handler: 'ConfigFunction' }, { xtype: 'button', value: '删除', handler: 'Delete' } ], bind: { store: 'store' } }).render($('body')); } </script> <style type="text/css"> html, body { margin: 0; padding: 0; } .window { position: absolute; border: 1px solid #ccc; background-color: #fff; } .window .title { height: 30px; text-align: left; line-height: 30px; font-weight: bold; text-indent: 5px; background-color: #cbf; color: #fff; } .layer { width: 100%; height: 100%; position: absolute; top: 0px; left: 0px; background-color: #edb; opacity: 0.4; } .hidden { display: none; } .close { } .frt { float: right; } </style> <link href="~/Content/page.css" rel="stylesheet" /> <link href="~/Content/table.css" rel="stylesheet" /> <link href="~/Content/component.css" rel="stylesheet" /> <script src="~/layer/layer.min.js"></script> </head> <body> </body> </html>
完全没有继续下去的欲望

浙公网安备 33010602011771号