这是我带来的方法:
在服务器端会是什么样子
- 每个控件都有自己的 JavaScript 模块
- 每个 Control 都包裹在其根
<div>
元素中。
- 服务器可以在每个页面生命周期中调用此辅助方法:
ScriptModule.AddParam("param_name", "param_value");
此参数将pre_render
作为 HTML5 的data-
属性在事件调用时添加到控件的包装器(div)中。
- 最后,服务器用
ScriptModule.Register("module_name", "path_to_js_file", "controlWrapperId")
.
这会导致 HTML 中的这些步骤:
<script>
文件 ( path_to_js_file
) 被插入到链接到所需模块文件的页面中。
- 参数通过
data-
属性添加到Control的包装器(div)中。
- 在页面的末尾
Core.start("module_name", "controlWrapperId");
插入了内联,这开始了模块的初始化。此方法稍后在客户端部分讨论。
在客户端会是什么样子
下载的第一个文件是Core.js文件,它注册了一个用于定义新模块的全局变量Core 。
每个 JavaScript 文件都将被定义为模块。该模块不应该向全局范围公开任何内容,并且应该是自我运行的。模板如下:
// 1. first param is module's name
// 2. than the array with dependencies to helpers modules
// 3. than the callback with following parameters
// a. jQuery object which references wrapper (i.e. div) of this module
// b. params hash-object, which contains server parameters from wrapper's -data attributes in format
// { 'param1_name': 'param_val',
// 'param2_name': 'param2_val' }
// c. then the external dependencies to helper modules
Core.htmlModule('mod name', ['external', 'deps'], function ($w, params, external, deps) {
// Here the module initializes itself
// it can communicate with other modules through Core.publish(); Core.subscribe();
// it does not return anything, because it is HTML module and so it does not expose anything
});
第二个参数定义了所谓的帮助模块,用于代码重用。由于普通模块的独立性和无法将某些功能暴露在外部,因此需要共享相同的代码。这可以通过定义帮助模块来实现,该模块可以公开其一些属性,然后从普通模块中引用。