3

数字/レジストリを使用して数字のオブジェクトを取得しようとしているので、そのプロパティを読み取ったり変更したりできます。しかし、何らかの理由で、以下の (省略された) コードのレジストリ オブジェクトに "byId" メソッドが存在しないという JavaScript エラーが発生します。

define(["dojo/dom-style", "dijit/registry", [...] ],
        function(domStyle, registry, [...])
{
    var self =
    {
        moveSplitter: function(datasetsLength)
        {   
             var myBC = registry.byId("studiesBorderContainer");    
        },
    }
}

JSFiddle でこの問題を再現できるようです。

http://jsfiddle.net/rUNNr/2/

それでも、Dojo のドキュメント ページでは機能します(ページの一番下にある例を参照してください... [実行] をクリックしたときの出力の最初の行を、JSFiddle のそれと比較してください)。

私は何が欠けていますか?(注: Dojo の例として JSFiddle を正しくセットアップしなかった可能性もあります。)

4

3 に答える 3

3

(少なくともリンク先の Fiddle では) を呼び出して実際に dijit を作成していないように見えますparser.parse()

コールバックの最初の行としてへの呼び出しを追加し、から有効な dijit ID を取得しました。parser.parsereadyregistry.byId()

于 2013-08-06T01:55:47.677 に答える
1

他の 2 人の投稿者が私の jsFiddle に問題を見つけましたが、私の最初の質問に対する答えではありませんでした。私は今自分で答えを見つけたので、他の誰かが同様の問題を抱えている場合に備えて共有しています.

元の質問は、registry.byId() 呼び出しが「メソッドが存在しない」を返すことでした。答えは、(明らかに) define([...],function(...)] ブロックから "dijit/registry" にアクセスすることはできず、代わりに require() を使用する必要があるということです。 define() と require() の違いを理解しているので、これを読んで役に立ちました:

http://dojotoolkit.org/documentation/tutorials/1.9/modules/

要するに、define() はモジュールを定義しますが、明らかにそれを必要とする特定のものにアクセスするために、定義したモジュール内で引き続き require() ブロックを使用できます。私はまだこれを完全には理解していません (つまり、「数字/レジストリ」が定義ブロックに追加されたときに機能しない理由) が、何らかの理由でこれで問題が解決しました。SO 私のコードは次のようになります。

define(["dojo/dom-style", [...] ],
        function(domStyle, [...])
{
    var self =
    {
        moveSplitter: function(datasetsLength)
        {   
            require(["dijit/registry"],
            function(registry)
            {
                var myBC = registry.byId("studiesBorderContainer"); 
            },
        }
    }
}

元の質問のコードと比較して、違いを確認してください。そして今、それは機能します。

于 2013-08-06T20:07:29.480 に答える
1

ドキュメントはこれについてのregistry.byId()洞察を提供します:

... data-dojo-type 属性を使用してマークアップで宣言された、またはプログラムで宣言された、解析された dijit でのみ機能します。同じ id 属性がパラメーターとして使用されますが、この場合に返されるのは、マークアップが解析されて dijit に変換されるときに Dojo ウィジェット システムによって作成されたオブジェクトです。

したがって、あなたの例では、この動作は理にかなっています:

  • 最初のケースは、ID「textNode3」を持つ div が実際の Dojo ウィジェットではないため、Dojo のレジストリー・モジュールによって認識されない場合です。
  • 2 番目のケースは、ID「myTextBox3」の入力に data-dojo-type 属性が提供されているにもかかわらず、Dojo がまだ実際にマークアップを解析していない場合です。レジストリのリファレンス ガイドの最後の例で、提供されたマークアップを実際に解釈するためにパーサー モジュールを呼び出すことがわかります。

この行を Fiddle に追加すると、例が意図したとおりに機能しました。

于 2013-08-06T01:56:37.817 に答える