从Atlas到Microsoft ASP.NET AJAX(4) - Browser Compatibility
版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。 |
Browser Compatibility 在CTP版本中使用为解决浏览器兼容问题提供了一个抽象层,将功能集中到了IE浏览器的使用方式上。在服务器端如果发现客户端使用的不是IE浏览器,则会立即添加一个额外的JavaScript引用。 在RTM版本中,这一抽象层依旧存在,但是它基于了标准,也改进了其设计。因此,服务器端的浏览器类型调查已经不需要。取而代之的是在客户端进行的浏览器功能检查,以及一些其它经过抽象的API。一些基于组件的API也会使用这些抽象,例如,之前谈到的事件模型使用了DomEvent.addHandler和DomEvent.removeHandler这两个基于标准的方法。请注意,事件的命名规则是使用了“click”而不是“onclick”,这些API的名字和组件或类型使用的命名规则保持了一致。 Building Debug and Release Scripts 我们设计的情景使我们意识到需要为ASP.NET AJAX提供一个强大而稳定的工具支持。这样的工具需要有能够支持工具的debug脚本,另外,它还有能力为产品环境创建release脚本。 在CTP版本中,debug和release脚本几乎没有差别,仅仅是release得到了压缩,移除了不必要的空格而已。在RTM版本中,我们考虑为Debug脚本提供强大的工具支持和编程体验,因此现在的debug脚本里有:
Doc Comments 如果您是开发组件开发人员,您现在可以在Debug脚本中提供您自定义类型的类型描述信息,它们的作用是为Visual Studio“Orcas”提供的IntelliSense和语句补充(这些功能不会在Visual Studio 2005中出现)功能所需的信息。另外,文档注释也提供了使用Client FX验证机制来进行“编译时”检查的支持。 文档注释提供了以下功能:
Type.registerNamespace('Custom.UI'); Custom.UI.BorderBehavior = function(element) { /// <summary>A border behavior</summary> /// <param name="element">Associated element</param> Custom.UI.BorderBehavior.initializeBase(this, [element]); } Custom.UI.BorderBehavior.prototype = { ... get_color: function() { /// <summary>Color</summary> /// <value type="String"/> return this._color; }, ... } Defining Type Descriptors 在CTP版本中,您通过继承Compoenent类而实现了ICustomTypeDescriptorProvider接口,因此您会重写getDescriptor方法并返回一个TypeDescriptor对象,以此支持XML-Script的解析,例如binding。 下面的例子展示了在CTP版本中定义一个Button类的代码,请注意它使用closure的方式。如下: Custom.Button = function(associatedElement) { Custom.Button.initializeBase(this, [associatedElement]); .. this.getDescriptor = function() { var td = Sys.UI.Button.callBaseMethod(this, 'getDescriptor'); td.addProperty('command', String); td.addProperty('argument', String); td.addEvent('click', true); return td; } ... } 在RTM版本中类型描述符被去除了,原因如下:
以上这些功能,包括XML-Script,已经被放入了Value-add包内,可以继续配合RTM版本使用。因此您能够编写一个组件,并支持开发人员通过XML-Script使用它。为了支持这种能力,Value-add包内仍然包括了TypeDescriptor对象的使用,不过现在已经使用JSON来表示了。这样,RTM版本无需任何支持就能定义一个类型描述符了。 下面的示例展示了与之前类似的Button组件的开发方式,不过现在是使用RTM版本进行开发。如下: Custom.UI.Button = function(associatedElement) { Sys.UI.Button.initializeBase(this, [associatedElement]); } Custom.UI.Button.prototype = { ... } Custom.UI.Button.descriptor = { properties: [ {name: 'color', type: String } ], methods: [ ... ], events: [ {name:'click'}, ... ] } 您可以为属性添加readOnly的描述,以此确保这个属性有一个默认值.如下: MyControl.descriptor = { properties: [{name: "title", type: String, readOnly: true}] } 如果您需要引用一个DOM元素,则使用Sys.UI.DomElement作为类型。如下: MyControl.descriptor = { properties: [{name: "...", type: Sys.UI.DomElement }] } 类似地,如果一个组件定义了一些引用其它组件的属性(可能在制作一个组合表单),那么在TypeDescriptor里则应该表明对这个类型的引用。如下: MyControl.descriptor = { properties: [{name: "...", type: Custom.Button }] } 如果您使用了Value-add包内的XML-Script,您就能够为类型的名字对应一个tag。Value-add脚本会根据类型描述符处理其余所有的工作。 本文出自 “赵劼” 博客,转载请与作者联系! 本文出自 51CTO.COM技术博客 |



jeffz
博客统计信息
热门文章
最新评论
友情链接
