我使用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
}]);
问题在于我,它运作良好,但当我把“dijit.byId(”id1“)”放在第二位时,它显示:
dijit.byId(“”)。未定义
答案 0 :(得分:2)
在dojo解析文档后执行ready函数&amp;构建了你试图使用dijit.byId获取的小部件。
第二部分没有放在ready函数中,所以dojo找不到你的元素了!
解决方案:在准备好的函数中访问您的元素或不要以声明方式声明它们(就像使用html代码一样......)!
卢西恩
答案 1 :(得分:1)
dojo.ready()函数注册一个事件处理函数(回调),它将在DOM被完全解析后触发。 如果你想确保在对它们执行操作之前将每个html元素作为dojo-widget重新呈现,这非常方便。
因此,在您的示例中,在通过加载必要的模块(dijit / registry,...)使dijit.byId()函数可用之前,将执行Code II。代码II只能在dom-ready事件被触发后才能工作,并且你的“dojo.ready()”函数确实加载了所需的模块。
你应该花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