0

Script# Web サイトからダウンロードした 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を参照してください

モジュールへの参照を持つ呼び出し元は、object.member スタイルを使用しfooて、型にアクセスできます。foo.MyElementEventHandlers

例えば:

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

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

単体テストに加えて、これは、script# AMD スクリプト ローダー (AroundMe サンプル)、はるかによく知られている requirejs AMD ローダー (KOWorld サンプル) で生成されたスクリプトの使用を示す、github リポジトリにあるさまざまなサンプルにも示されています。 、および AMD パターンを使用しない場合 (FishTank サンプル)。

それが役立つことを願っています。

于 2013-03-05T20:21:23.100 に答える