Hello World
Spiga

Atlas中有趣且无用的功能:Sys.UI.Window类

2006-10-20 16:19 by 老赵, 2685 visits
  Atlas的客户端代码中有着一个有趣的类,就是Sys.UI.Window。这个类的功能非常简单,只是对于Javascript功能的封装,用于提供各种提示框。

众所周知,在Javascript中我们使用window.alert来显示提示框,window.confirm来显示确认框,window.prompt来显示输入框。但是就这一点点功能,Atlas也为我们作了封装。自然功能不是很大。

看看简单的使用方式,自然会使用HTML来调用:
<atlas:ScriptManager ID="ScriptManager1" runat="server" />
        
<input type="button" value="Show Input Box" onclick="showInputBox()" />
<br /><br />
        
<input type="button" 
    value
="Show Message Box (OK Only)" 
    onclick
="showMessageBox(Sys.UI.MessageBoxStyle.OK)" />
<br /><br />
        
<input type="button" 
    value
="Show Message Box (OK Cancel)" 
    onclick
="showMessageBox(Sys.UI.MessageBoxStyle.OKCancel)" />
<br /><br />
        
<div id="display"></div>

在Atlas中,window.alert函数被封装成了Sys.UI.Window.inputBox方法,传入提示文字和默认文字作为参数。如下:
function showInputBox()
{
    
var promptText = "请输入文字:";
    
var defaultValue = "默认文字";
        
    
var input = Sys.UI.Window.inputBox(promptText, defaultValue);
    
if (input == null)
    {
        $(
"display").innerText = "您没有输入内容";
    }
    
else
    {
        $(
"display").innerText = "您输入了:" + input;
    }    
}

可以看到,这个方法基本上和window.prompt的使用方法如出一辙。

与此相比,Sys.UI.Window.messageBox就把window.alert和window.confirm函数封装在了一起:
function showMessageBox(style)
{
    
var text = "请点击按钮";
    
var result = Sys.UI.Window.messageBox(text, style);
    
    
if (result == Sys.UI.DialogResult.OK)
    {
        $(
"display").innerText = "您点击了“确定”";
    }
    
else
    {
        $(
"display").innerText = "您点击了“取消”";
    }
}

Sys.UI.Window.messageBox第一个参数为提示信息,第二个参数是Sys.UI.MessageBoxStyle枚举类型的值:OK或OKCancel。根据style的不同,Sys.UI.Window选择应该调用window.alert还是window.confirm函数。Sys.UI.Window.messageBox函数的返回值Sys.UI.DialogResult枚举的值:OK或Cancel。

似乎Atlas的封装,唯一的作用就是我们的代码看上更像比如C#等语言的的使用方式了。

不过为什么要这么做?


点击这里查看效果。
Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

15 条回复

  1. 小蜗牛
    *.*.*.*
    链接

    小蜗牛 2006-10-20 17:17:00

    这种无用真的不可以变成有用么?@@

  2. 老赵
    admin
    链接

    老赵 2006-10-20 17:25:00

    不得不承认这的确是无聊的扩展……

  3. aspnetx
    *.*.*.*
    链接

    aspnetx 2006-10-20 18:27:00

    也许是为了以后的扩展吧

  4. fds2003
    *.*.*.*
    链接

    fds2003 2006-10-20 21:36:00

    这还不如自己写JS!

  5. 老赵
    admin
    链接

    老赵 2006-10-20 23:49:00

    @fds2003
    没错,呵呵。

  6. 兰亭
    *.*.*.*
    链接

    兰亭 2006-10-21 07:32:00

    应该说这样要直观一些

  7. 老赵
    admin
    链接

    老赵 2006-10-21 08:51:00

    @兰亭
    这样没有意义的封装应该不太会有了

  8. cathsfz
    *.*.*.*
    链接

    cathsfz 2006-10-23 13:49:00

    这样做是很有理由的,请看《Script# - 把 C# 编译为 JavaScript》
    http://cathsfz.sitesled.com/2006/09/script-cjavascript.htm

    最终,和GWT将Java编译为JavaScript一样,你将可以使用C#来编写双端逻辑,客户端的自动编译为JavaScript。

  9. 老赵
    admin
    链接

    老赵 2006-10-23 13:56:00

    @cathsfz
    在这里,所谓的“编译”只是做了语言的转换,现在的封装意义还是不大,因为这样的封装并没有提供什么重要的功能,只是更“美观”了一点。:)

  10. cathsfz
    *.*.*.*
    链接

    cathsfz 2006-10-24 00:58:00

    @Jeffrey Zhao
    整个Atlas制作得代码书写风格和C#那么类似,就是为Script#做准备。GWT实现了很多Java基础类的对应JavaScript类,Atlas当然也必须这样做,这后的编译才能直接对应上。至于用不到……其实现在从Beta1看来,Atlas根本就是在耍我们这些以客户端为中心的开发者,客户端的功能功能除了迁移到CTP的,还有一些被直接裁剪掉,它的最终目的还是让所有人都屈服于以C#为中心的开发。

    至于这是编译还是翻译,我还没了解过,去下载Script#的源代码看看应该也就知道了。(其实是否开源我也不清楚,但总可以用Reflector看看吧,希望没有加壳加密)

  11. 老赵
    admin
    链接

    老赵 2006-10-24 01:27:00

    @cathsfz
    首先,Atlas的代码书写风格和C#可以说完全不同,另外这篇文章提到的封装,已经被取消了。RTM版本中取消了类似的一些无用的功能。
    其次,Script#目前只是Nikhil的个人作品,还没有迹象表明它会被应用到ASP.NET中,而且Javascript的表现能力远远超过C#,使用C#编写Javascript功能本身的能力就有限。再加上官方已经表明在下一版本的Visual Studio中将会提供对于JavaScript的良好IntelliSense支持,因此短期内不太可能会结合Script#或者类似的工具了,更加不要说在Atlas中提供这种支持。
    另外,从RTM版本的内容中看,Microsoft ASP.NET AJAX的目的是在客户端提供一个强大的模型,而不是让我们将中心全部转向C#或者服务器端。
    而且,即使真会出现Script#之类的功能,做这样的封装也是没有任何意义的。难道为了实现C# -> Javascript的功能,还必须在客户端实现一个JavaScript编写部分.NET Framework?而且试想一下,这个封装对于减少代码大小也是毫无作用的。在这里的封装完全只是个形式的改变。
    还有就是Script#并不会编译代码,它只是做一个语言和语法的转换。
    最后,我觉得您可能误解了Atlas的目的和意义,所以才得出了它在“耍我们这些以客户端为中心的开发者”。Atlas提供了大量的强大的服务器功能以及控件,是为了抽象和封装一系列功能,其实在这些控件(例如Control Toolkit)中包含了大量的JavaScript代码,因为要实现客户端的功能是离不开大量客户端脚本的。抽象和封装能够大量减少开发复杂性,也有利于组件的部署与分发。这样有利于页面开发人员的使用,但是组件开发人员依旧不可能避免接触大量的客户端脚本。
    当然,我不排除Script#以后的发展状况,但是就目前来说,Atlas没有必要为它这么做。

  12. cathsfz
    *.*.*.*
    链接

    cathsfz 2006-10-24 01:52:00

    @Jeffrey Zhao
    Beta1中,debug.trace和debug.dump已经没掉了,没有一个强大的debug让人怎么开发客户端为中心的应用啊,因此我把我的项目由July CTP升级到Beta1就发现没办法做下去,因为我连简单的测试信息输出都做不到了。

    在PreviewScript.js里面,你能看到一个很搞笑的做法:
    if(!debug.trace) {
    debug.trace = function debug$trace(message) {
    }
    }
    意思就是,如何很不幸CTP中有哪个地方原本存在debug.trace的而Preview中确实忘记去掉了,那也不用怕,至少不会引发任何错误。

    结果,我去July CTP把debug.trace和debug.dump的代码重新弄回来,添加到Beta1上面去,用Beta1的prototype书写方式。由于debug.dump会检测传入变量是否为IArray、是否为ITypeDescriptorProvider以及是否为Event,而这3个东西在Beta1都去掉了,所以有关的功能就只能注释掉,功能会有所削弱。

    裁减别的功能我都不会太反对,但是debug是客户端为中心开发的基础啊,一个Library是否算是出色这算一个重要的条件,这也裁就真的是对客户端为中心的开发人员不厚道了。

    另外,我们好像在深夜版聊,呵呵……如果可以,不如直接加MSN聊算了。晚安啦……

  13. 老赵
    admin
    链接

    老赵 2006-10-24 02:05:00

    @cathsfz
    您说的的确是一个问题,在这一点上的确做得不好。不过您说的ITypeDescriptor,IArray等问题其实只是换了个做法而已,仍然可以实现。:)
    我不介意深夜聊天,而且我很高兴能和您一起聊这些话题。有时候用IM聊有个坏处就是思考往往还不充分就说出去了。如果要思考完整的话……您总不太愿意等5分钟才看到我回复吧。:)

  14. a_a
    *.*.*.*
    链接

    a_a 2006-11-11 17:44:00

    试想未来某个版本的IE内建Script#支持,并且声称因JS不安全所以不再提供支持!

  15. 老赵
    admin
    链接

    老赵 2006-11-11 18:07:00

    @a_a
    浏览器的安全模型是不错的。:)

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我