FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

本论坛已关闭(禁止注册、发帖和回复)
请移步 三石和他的朋友们

FineUI首页 WebForms - MVC & Core - JavaScript 常见问题 - QQ群 - 十周年征文活动

FineUI(开源版) 下载源代码 - 下载空项目 - 获取ExtJS - 文档 在线示例 - 版本更新 - 捐赠作者 - 教程

升级到 ASP.NET Core 3.1,快、快、快! 全新ASP.NET Core,比WebForms还简单! 欢迎加入【三石和他的朋友们】(基础版下载)

搜索
查看: 1592|回复: 1
打印 上一主题 下一主题

不明之处,为什么多处用客户端事件,也不提供服务端方法

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-8 01:07:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 szjazz 于 2013-1-8 01:11 编辑

看了示例和Appbox源代码,有多处还继续使用script 脚本来设置某些控件的事件OnClientClick,比如:FineUI的示例首页中的下拉菜单中的”展开、折叠“
  1. <x:MenuButton ID="btnExpandAll" IconUrl="~/images/expand-all.gif" Text="展开菜单" EnablePostBack="false"  runat="server">
  2.                                     </x:MenuButton>
  3.                                     <x:MenuButton ID="btnCollapseAll" IconUrl="~/images/collapse-all.gif" Text="折叠菜单"
  4.                                         EnablePostBack="false" runat="server">
  5.                                     </x:MenuButton>
复制代码
  1.     <script src="./js/default.js" type="text/javascript"></script>
复制代码
  1. function onReady() {
  2.     var btnExpandAll = Ext.getCmp(IDS.btnExpandAll);
  3.     var btnCollapseAll = Ext.getCmp(IDS.btnCollapseAll);
  4.     var mainMenu = Ext.getCmp(IDS.mainMenu);
  5.     var mainTabStrip = Ext.getCmp(IDS.mainTabStrip);
  6.     var windowSourceCode = Ext.getCmp(IDS.windowSourceCode);

  7.     function getExpandedPanel() {
  8.         var panel = null;
  9.         mainMenu.items.each(function (item) {
  10.             if (!item.collapsed) {
  11.                 panel = item;
  12.             }
  13.         });
  14.         return panel;
  15.     }

  16.     // 点击全部展开按钮
  17.     btnExpandAll.on('click', function () {
  18.         if (IDS.menuType == "menu") {
  19.             mainMenu.expandAll();
  20.         } else {
  21.             var expandedPanel = getExpandedPanel();
  22.             if (expandedPanel) {
  23.                 expandedPanel.items.itemAt(0).expandAll();
  24.             }
  25.         }
  26.     });

  27.     // 点击全部折叠按钮
  28.     btnCollapseAll.on('click', function () {
  29.         if (IDS.menuType == "menu") {
  30.             mainMenu.collapseAll();
  31.         } else {
  32.             var expandedPanel = getExpandedPanel();
  33.             if (expandedPanel) {
  34.                 expandedPanel.items.itemAt(0).collapseAll();
  35.             }
  36.         }
  37.     });

  38.     function createToolbar() {

  39.         // 由工具栏上按钮获得当前标签页中的iframe节点
  40.         function getCurrentIframeNode(button) {
  41.             // 注意:button.ownerCt 是工具栏,button.ownerCt.ownerCt 就是当前激活的标签页。
  42.             return Ext.DomQuery.selectNode('iframe', button.ownerCt.ownerCt.el.dom);
  43.         }

  44.         // 动态创建按钮
  45.         var sourcecodeButton = new Ext.Button({
  46.             text: "源代码",
  47.             type: "button",
  48.             cls: "x-btn-text-icon",
  49.             icon: "./res.axd?icon=PageWhiteCode",
  50.             listeners: {
  51.                 click: function (button, e) {
  52.                     windowSourceCode.box_show('./source.aspx?files=' + getCurrentIframeNode(button).attributes['src'].value, '源代码');
  53.                     e.stopEvent();
  54.                 }
  55.             }
  56.         });

  57.         var openNewWindowButton = new Ext.Button({
  58.             text: '新标签页中打开',
  59.             type: "button",
  60.             cls: "x-btn-text-icon",
  61.             icon: "./res.axd?icon=TabGo",
  62.             listeners: {
  63.                 click: function (button, e) {
  64.                     window.open(getCurrentIframeNode(button).src, "_blank");
  65.                     e.stopEvent();
  66.                 }
  67.             }
  68.         });

  69.         var refreshButton = new Ext.Button({
  70.             text: '刷新',
  71.             type: "button",
  72.             cls: "x-btn-text-icon",
  73.             icon: "./res.axd?icon=Reload",
  74.             listeners: {
  75.                 click: function (button, e) {
  76.                     getCurrentIframeNode(button).contentWindow.location.reload(); //.replace(href);
  77.                     e.stopEvent();
  78.                 }
  79.             }
  80.         });

  81.         return new Ext.Toolbar({
  82.             items: ['->', sourcecodeButton, '-', refreshButton, '-', openNewWindowButton]
  83.         });
  84.     }


  85.     // 初始化主框架中的树(或者Accordion+Tree)和选项卡互动,以及地址栏的更新
  86.     X.util.initTreeTabStrip(mainMenu, mainTabStrip, createToolbar);


  87.     // 公开添加示例标签页的方法
  88.     window.addExampleTab = function (id, url, text, icon) {
  89.         X.util.addMainTab(mainTabStrip, id, url, text, icon);
  90.     };

  91. }
复制代码

甚至还有通过服务端来添加按钮的事件,比如Appbox的用户管理的新增按钮:
  1. <ext:Button ID="btnNew" runat="server" Icon="Add" EnablePostBack="false" Text="新增用户">
复制代码
而在页面初始化过程里,代码设置控件的客户端事件
  1. btnNew.OnClientClick = Window1.GetShowReference("~/admin/user_new.aspx", "新增用户");
复制代码

所有的这些,为什么不能直接用服务端的控件事件来呢,难道OnClick暂时还不能担当完成功能所需?

故而这些,有时看不明白代码或者说规划设计为什么要如此?,还请大师们、始祖们释疑!



沙发
发表于 2013-1-8 01:23:04 | 只看该作者
这个我个人理解很简单,FineUI的确做的非常不错,绝大多数功能,如你说的这些客户端执行的功能服务端不是不可以完成,但三石这样做的目的(把代码写在客户端),就是为了尽量减少服务端压力,减少客户端和服务端的交互次数,所以尽可能的让能在客户端完成的事情都交给客户端。项目做多自然会明白这样做的好处了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|FineUI 官方论坛 ( 皖ICP备2021006167号-1 )

GMT+8, 2024-11-29 10:39 , Processed in 0.043239 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表