使用 dijit.byId w dojox.mobile 小部件

Posted

技术标签:

【中文标题】使用 dijit.byId w dojox.mobile 小部件【英文标题】:using dijit.byId w dojox.mobile widgets 【发布时间】:2012-07-08 16:39:21 【问题描述】:

我正在通过此函数在静态定义的 dojox.mobile.RoundRectList 小部件下动态构建一系列 dojox.mobile.ListItem 小部件...

function displayOpps(items) 

// Create the list container that will hold application names
var rrlOppsContainer = dijit.byId("rrlOpps");   
// Add a new item to the list container for each element in the server respond
for (var i in items)

    // Create and populate the list container with applications' names
    var name = items[i].CustName + " - " + items[i].OppNbr;
    var liOpps = new dojox.mobile.ListItem(
        label: name,
        moveTo: "sv3OppDetail"  
    );

    // Add the newly created item to the list container
    rrlOppsContainer.addChild(liOpps);

当我在 html 文件中的 onLoad() 期间运行此代码时,使用 Chrome 的开发工具时出现以下错误...

Uncaught TypeError: Object # has no method 'byId'

我已经阅读了很多关于这个主题的文章,似乎很多人都有这个问题,但我发现的每一篇文章都与其他一些技术(例如 Spring MVC 等)有关,我正在尝试使用基于 dojox.mobile 的应用程序。也就是说,我试图通过将其包含在我的 html 文件中来模仿其他人提出的一些解决方案,但它仍然不起作用......

<script type="text/javascript"
data-dojo-config="isDebug: true, async: true, parseOnLoad: true"
src="dojo/dojo.js">
dojo.require("dojox.mobile.RoundRectList")
</script>

我做错了什么?

提前感谢您的时间和专业知识。

【问题讨论】:

【参考方案1】:

如果您使用的是 Dojo 1.7+,您可能只是忘记了需要“dijit/registry”模块。这是定义 byId 函数的地方。当您使用桌面小部件时,它会由其他基本模块间接加载,但使用 dojox/mobile 您必须显式加载它(因为 dojox/mobile 默认仅加载非常少的模块集,以最大限度地减少代码占用)。

根据您编写应用程序的方式,执行以下操作:

dojo.require("dijit.registry");  // legacy (pre-1.7) loader syntax
...
var rrlOppsContainer = dijit.byId("rrlOpps");
...

或者这个:

require(["dijit/registry", ...], function(registry, ...) // 1.7+ AMD loader syntax
    ...
    var rrlOppsContainer = registry.byId("rrlOpps");
    ...
);

另请注意,您的第二个代码示例在使用旧版加载器语法时尝试使用异步加载 (async: true)。这不起作用,要获得异步加载,您必须使用 AMD 语法。

【讨论】:

hmmmm... 我将 async 参数更改为 false,然后添加 dojo.require("dijit.registry"); 的旧语法;如建议的那样,错误仍然存​​在。正如我之前所说,我已经看到了很多这样的功能示例,所以我相信我还有一些其他错误阻止了 dijit 包被加载。还有其他想法吗? 我发现了我的问题...我混合了旧语法和 AMD 语法。感谢您的时间和专业知识。

以上是关于使用 dijit.byId w dojox.mobile 小部件的主要内容,如果未能解决你的问题,请参考以下文章

dojo.byId() 有效,但 dijit.byId() 无效

dijit.byId 不起作用(不是函数吗?)

如何禁用“dijit.form.FilteringSelect”小部件?

destroy()、destroyRecursive(true)、destroyDescendants() 的区别

如何将 Dijit 小部件动态添加到 Dojo 表单?

dojo 表单验证清除