在Worklight中使用Angularjs时未定义dijit.byId(“”)

时间:2013-02-15 04:31:54

标签: angularjs dojo ibm-mobilefirst

我使用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(“”)。未定义

2 个答案:

答案 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