2

私は Angular JS アプリケーションを持っています。このアプリケーションでは、dojo ウィジェットを使用したいと考えています (実際には使用しなければなりません)。コントローラーの HTML テンプレートでは、Dojo マークアップを含む HTML を返すことができます。ただし、ビューが再レンダリングされるとき、Dojo の構文解析は自動的には行われません。再解析をトリガーできる唯一の方法は、コントローラーでこのようなことを行い、モデルが変更されたことがわかったときに呼び出すことで、少し遅れて手動でパーサーを呼び出すことです。

refreshDojo = function() {
    setTimeout(function() {
        require(["dojo/parser"], function(parser) {
                parser.parse()
                });
        }, 10);
}

これは、次の 2 つの理由から実際には実現可能ではありません。

  1. タイムアウト後に何かをしなければならないことは、HTML が処理される前にすばやく発生するか、2 つの時間が遅くなり、ウィジェットが作成される前にコンテンツのフラッシュが発生することで、問題を引き起こすことになります。
  2. 第二に、私が間違っていなければ、parser.parse() は DOM 全体を解析しますが、単一の div のみを更新した場合はあまり効率的ではありません。

適切なタイミングで確実にトリガーできるように、DOM がいつ安定したかを確実に知る方法はありますか? また、コントローラーのルート要素にアクセスする方法はありますか ($element を注入できなくなったようです)。

4

2 に答える 2

3

サービスを装飾する必要がある$compileため、angular が何かをコンパイルする前に、dojo にコンパイルさせます。

ここに小さな例があります: http://plnkr.co/edit/9iJJFLWDqGtyqLV5Mbe3?p=preview

デコレータに関するドキュメント: http://docs.angularjs.org/api/AUTO.$provide#decorator

于 2013-01-24T19:54:57.240 に答える
0

dojoType指定されたウィジェット モジュール (および必要に応じてミックスイン) を必要とする属性ディレクティブを作成し、 Dojo パーサーの代わりにそれらをインスタンス化することができます。

たとえば、DOM の一部 (「ajax」) をロードした場合、最初に新しいスコープを作成し、それをコンパイルしてスコープに対してリンクし (dojoType ディレクティブが適用されます)、次に、 Dojo パーサーを開き、rootNode.

dojoParser.parse({
    rootNode: dom.byId(domid)
}).then(/* access the widgets or whatever */);
于 2015-01-23T16:47:17.757 に答える