0

私は、いくつかのカスタムDojoウィジェット(つまり、自分で作成したウィジェット)を別のサーバーからロードする必要があるプロジェクトに取り組んでいます。数日間の最善の努力にもかかわらず、Dojoにウィジェットをロードさせることができないようです。

DojoはGoogleCDNから読み込まれ、ウィジェットはwww.example.comから読み込まれ、ウェブサイトはwww.foo.comにあります。

実際のプロジェクトファイル(これは会社のプロジェクトです)を投稿できませんが、より小さなテストファイルでエラーを再現しました。

Test.html(www.foo.com):

<html>

<div id="content"></div>

<script>
    var djConfig = {
        isDebug: true,
        modulePaths: {
            'com.example': 'http://example.com/some/path/com.example'
        }
    }
</script>

<script src="https://ajax.googleapis.com/ajax/libs/dojo/1.4.3/dojo/dojo.xd.js.uncompressed.js"></script>

<script type="text/javascript">
    dojo.require("dijit._Widget");
    dojo.require("dijit._Templated");

    dojo.addOnLoad(function() {
        dojo.require("com.example.widget.Test", false);

        dojo.addOnLoad(function() {
            new com.example.widget.Test().placeAt(dojo.byId('content'));
        });
    });
</script>

</html>

Test.xd.js(www.example.com/some/path/com.example/widget/Test.xd.js):

dojo.provide("com.example.widget.Test");

dojo.require("dijit._Widget");
dojo.require("dijit._Templated");

dojo.declare("com.example.widget.Test", [dijit._Widget, dijit._Templated], {
    templateString: "<div dojoAttachPoint=\"div\">This is a test</div>",

    postCreate: function() {
        console.log("In postCreate");
        console.log(this.div);
        this.div.innerHTML += '!!!';
    }
});

Firebugでは、クロスドメインリソースcom.example.widget.Testを読み込めないというエラーが数秒後に表示されます。ただし、[ネット]タブでは、Test.xd.jsが正常にダウンロードされ、ブレークポイントを設定して、dojo.declareがエラーなしで実行および完了することを確認できます。

助けていただければ幸いです。他にご提供できる情報がありましたらお知らせください。

4

1 に答える 1

1

XD-loader でモジュール宣言を処理する別の方法があります。これは、ローダーが「モジュール準備完了」イベントを処理する方法によるものです。dojo.addOnLoad は、必要なモジュールが宣言されていないことを「認識」しているため、ほとんどの場合、実行されません。

それでも、宣言されている可能性は非常に高く、dojotoolkit の 1.7 以降のバージョンでの変更は、その事実を認識しているようです。この理由は、「モジュール対応」のメカニズムが myModule.xd.js モジュールに正しく実装されていないためだと思います。

これは基本的に宣言の「ヘッダー」または「クロージャー」であり、いくつかの手順が含まれます-基本モジュールのすべてをdojo.provideおよびからラップしますeof

標準的な例のボイラー モジュール ファイル '{{modulePath}}/my/Tree.js'

dojo.provide("my.Tree");

dojo.require("dijit.Tree");

dojo.declare("my.Tree", dijit.Tree, {
    // class definition
});

X-Domain の例のボイラー モジュール ファイル '{{modulePath}}/my/Tree.xd.js

dojo._xdResourceLoaded(function(){ 
  return {
    depends: [
        ["provide", "my.Tree"],
        ["require", "dijit.Tree"]
    ],
    defineResource: function(dojo) {
      ///////////////////////////////
      /// Begin standard declaration
         dojo.provide("my.Tree");

         dojo.require("dijit.Tree");

         dojo.declare("my.Tree", dijit.Tree, {
            // class definition
         });
      /// End standard declaration
      ///////////////////////////////
    }
  }
})();
于 2012-07-25T17:10:51.113 に答える