1

dojo mobile 1.8.1 と angularjs 1.0.1 を使用して worklight でプロジェクトを作成しましたが、奇妙な問題が発生しました。

これが私のhtml部分です:

<div data-dojo-type="dojox.mobile.ScrollableView" data-dojo-props="selected:true"  id="id1" ></div>

<div class="full" data-dojo-type="dojox.mobile.View" id="id2"></div>

そして私のJavaScript部分:

require([
"dojo", "dijit/_base/manager","dojo/parser", "dijit/registry",
], function(dojo) {
dojo.ready(function() {

// dijit.byId("id1").performTransition("id2");   //////////place I

});
});


var angularApp = angular.module('app', [])
.run(['$rootScope','$templateCache','$route',
  function($rootScope,$templateCache,$route) {

dijit.byId("id1").performTransition("id2");////////place II
}]);

問題は I の場所にあります。うまく動作しますが、II の場所に "dijit.byId("id1")" を配置すると、次のように表示されます。

dijit.byId(""). が定義されていません

4

2 に答える 2

2

dojo が文書を解析し、dijit.byId を使用して取得しようとするウィジェットを構築した後、ready 関数が実行されます。

2 番目の部分は ready 関数内に配置されていないため、dojo はまだ要素を見つけることができません!

解決策: ready関数で要素にアクセスするか、宣言的に宣言しないでください (HTML コードを使用して行ったように...) !

ルシアン

于 2013-02-15T07:03:41.860 に答える
1

dojo.ready() 関数は、DOM が完全に解析された後に起動されるイベント ハンドラー関数 (コールバック) を登録します。これは、操作を実行する前に、すべての html 要素が dojo-widget として再レンダリングされていることを確認したい場合に非常に便利です。

したがって、あなたの例では、コード II は、必要なモジュール (dijit/registry など) をロードすることによって dijit.byId() 関数が使用可能になる前に実行されます。コード II は、dom-ready イベントが発生し、「dojo.ready()」関数が必要なモジュールをロードした後にのみ機能します。

dojo.ready() の内容を読むのに間違いなく 5 分を投資する必要があります: http://dojotoolkit.org/reference-guide/1.8/dojo/ready.html

補足: Dojo 1.8.1 では、dijit.byId() を使用しないでください。dijit.registry.byId() を使用してみてください (dijit/registry モジュールが必要です)。

http://dojotoolkit.org/reference-guide/1.8/dijit/registry.html#dijit-registry-byid

于 2013-02-18T13:36:35.217 に答える