0

我正在使用从 Script# 网站下载的 Script# 的自定义构建,并且生成的输出 javascript 文件具有以下代码示例:

// GeneralJS_v4.Wrappers.Elements.MyElementEventHandlers

function GeneralJS_v4$Wrappers$Elements$MyElementEventHandlers(element) {
  this._element = element;
  this._handlersMap = {};
}

如您所见,生成的类名是GeneralJS_v4$Wrappers$Elements$MyElementEventHandlers. 问题是,每当一个不同的项目引用另一个项目时,它不会$使用.符号(例如GeneralJS_v4.Wrappers.Elements.MyElementEventHandlers)来引用它们,因此它会给出找不到类的错误。

知道为什么它使用$生成的类名而不是.吗?

4

1 回答 1

0

Script# 0.8 对生成代码的更改也涵盖了相同的主题。

总结是生成的代码现在位于脚本模块中(实现为函数闭包),并且模块对象具有挂在其上的所有公共类型,供模块的使用者按照 AMD 模式访问。有关 AMD 模式本身的一些详细信息,请参见此处:http: //addyosmani.com/writing-modular-js/

出于说明目的,如果您的程序集对应于“foo”模块,则生成的脚本将类似于:

define('foo', ['ss'], function(ss) {

 // GeneralJS_v4.Wrappers.Elements.MyElementEventHandlers

 function GeneralJS_v4$Wrappers$Elements$MyElementEventHandlers(element) {
   this._element = element;
   this._handlersMap = {};
 }

 var $exports = ss.module('basic', null,
   {
     MyElementEventHandlers: [ GeneralJS_v4$Wrappers$Elements$MyElementEventHandlers, GeneralJS_v4$Wrappers$Elements$MyElementEventHandlers$, null ]
   });

 return $exports;
});

查看生成的输出并使用 ScriptTemplate 元数据属性改变输出的一个很好的例子是单元测试 - 请参阅https://github.com/nikhilk/scriptsharp/tree/cc/tests/TestCases/Basic/Simple

具有对foo模块的引用的调用者将能够访问您的类型,foo.MyElementEventHandlers即使用 object.member 样式。

例如:

require(['foo'], function(foo) {

  var o = new foo.MyElementEventHandlers(...);
});

除了单元测试之外,这也显示在 github 存储库中的各种示例中,这些示例显示使用生成的脚本与 script# AMD 脚本加载器(AroundMe 示例),更知名的 requirejs AMD 加载器(KOWorld 示例) ,以及不使用 AMD 模式(FishTank 示例)。

希望有帮助。

于 2013-03-05T20:21:23.100 回答