1

我在 worklight 中使用 dojo mobile 1.8.1 和 angularjs 1.0.1 制作了一个项目,但我遇到了一个奇怪的问题。

这是我的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,它运行良好,但是当我将“dijit.byId("id1")”放在位置 II 时,它显示:

dijit.byId(""). 未定义

4

2 回答 2

2

在 dojo 解析您的文档并构建您尝试使用 dijit.byId 获取的小部件之后执行 ready 函数。

第二部分没有放在 ready 函数中,所以 dojo 还找不到你的元素!

解决方案:在 ready 函数中访问您的元素,或者不要以声明方式声明它们(就像您所做的那样,使用 html 代码......)!

卢西安

于 2013-02-15T07:03:41.860 回答
1

dojo.ready() 函数注册了一个事件处理函数(回调),它将在 DOM 完全解析后触发。如果您想确保在对它们执行操作之前将每个 html 元素重新呈现为 dojo-widget,这将非常方便。

因此,在您的示例中,代码 II 将在通过加载必要的模块(dijit/registry,...)使 dijit.byId() 函数可用之前执行。只有在 dom-ready 事件被触发并且您的“dojo.ready()”函数确实加载了所需的模块之后,代码 II 才能工作。

您绝对应该花 5 分钟时间阅读 dojo.ready() 的内容: 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 回答