CoffeeScriptとRailsでは名前空間はどのように機能しますか?
-
24-12-2019 - |
質問
このCoffeeScript コード Gitlabから、そしてそれがどのように機能するのか疑問に思います。
class Issue
constructor: ->
$('.edit-issue.inline-update input[type="submit"]').hide()
$(".issue-box .inline-update").on "change", "select", ->
$(this).submit()
$(".issue-box .inline-update").on "change", "#issue_assignee_id", ->
$(this).submit()
@Issue = Issue
.
解決
@Issue = Issue
は、ローカル変数をグローバルスコープに公開するだけです。これはRubyやRailsでは何もありません。それは純粋にコーヒースクリプトの慣用句です。
CoffeeScriptは、グローバルスコープ内の変数の作成を防ぐために設計されているラッパー内で実行されます。そしてこのラッパーでは、this
(または@
)がグローバルオブジェクトです。
だからこれ:
class Issue
constructor: ->
@Issue = Issue;
.
ほぼこのJS:
(function() {
var Issue;
Issue = (function() {
function Issue() {}
return Issue;
})();
this.Issue = Issue;
}.call(window));
.
そのJSでは、window
がthis
になり、ウィンドウのプロパティがグローバル変数になります。そのため、Flow Onでは、他のJSファイルにIssue
のみを入力する必要があり、問題コンストラクターがあります。
@Issue = Issue
ラインがないと、Issue
コンストラクタはそのコードの外で利用可能ではなく、他のファイルは使用できません。
言い換えれば、これと同じです:
window.Issue = Issue;
.
私は実際にほとんどの時間を好む。 window
として起動しているのは、常にwindow
を意味しますが、@
は、表示されている場所によって多くのことを意味します。
他のヒント
JavaScriptと同じように、CoffeeScriptでは適切な名前空間はありません。@Issue = Issue
はthis.Issue = Issue
に変換されます。私の推測は、このスニペットがビルド中に他のファイルと連結されることを意図していることです。
var namespace1 = {subnamespace1: {}};
(function() {
// Several concatenated files
}).call(namespace1.subnamespace1);
. 所属していません StackOverflow