2

Minispadeフィルターは、各ファイルのコードをクロージャー内にラップします。これで、グローバルに公開されるはずのファイルで定義されたオブジェクトの場合、クロージャーにラップされるため、グローバルではなくなります。

では、メインのアプリファイルの別のファイルで定義されたオブジェクトを実際にどのように要求するのでしょうか。

これが私の例です。

私のファイルでは、test.js

var test = { sayHello: function(){alert('hello');} }

私のメインアプリファイルでは、次のことを行います。

require('todos/vendor/jquery-1.7.1');
require('todos/vendor/ember-0.9.5');
require('todos/vendor/test');

console.log(jQuery); // this logs the jQuery object
console.log(Ember);  // this logs the Ember object
console.log(test);   // this is undefined

testメインアプリのjsファイル内のオブジェクトにアクセスするにはどうすればよいですか?testファイル内でオブジェクトを別の方法で定義する必要があるということですか?

アップデート:

削除することでオブジェクトをグローバル名前空間にリークできますが、varそれが推奨されるアプローチですか?

4

1 に答える 1

4

minispadeの要点は、これらの「ファイル」を独自のクロージャ内に含めて、グローバル名前空間に漏れないようにすることです。vartestなしでそのようにリークさせるのは悪い考えであり、おそらくミニスペードを使用して間違った問題を解決しようとしています。

一般的なミニスペードパターンは、グローバルに使用可能な変数を定義することです(Emberの用語では、これはEmber名前空間またはになりますApp)。次に、各ミニスペードクロージャーは、モデル、ビュー、コントローラーなどを追加することでアプリに組み込まれます。たとえば。

App = Ember.Application.create();

次に、ミニスペードで、vehicle.jsのミニスペードクロージャーを作成します

App.Vehicle = Ember.Object.extend();

また、car.jsのミニスペードクロージャーも作成します。

require('vehicle');

App.Car = App.Vehicle.extend();

これにより、車を定義する前に、車両がロードされて実行されるようになります。

これを確認することをお勧めします:http://ryanto.github.com/#posts/rake-pipeline-assetfile(これは進行中の作業ですが、レーキパイプラインでのミニスペードの使用に関するセクションがあります)。

于 2012-09-17T13:46:23.747 に答える