Dojo 1.7 如何在 require() 之外使用 dojo 组件

2024-02-21

我在 Dojo 1.7.2 中使用 AMD 加载程序创建了如下所示的 Dojo 小部件

var myCpane;

require([
            "dijit/layout/ContentPane"
        ], function(ContentPane) {
        myCpane = new ContentPane();
});

myCpane.startup();  // It gives 'myCpane' as undefined

在上面的示例中,在最后一条语句中,变量“myCpane”为“未定义”,如果我在“require()”回调函数中使用“myCpane.startup()”,那么它将正常工作。

但我想在“require”函数之外使用“myCpane”变量(出于很多原因)。我知道“require()”回调函数的执行由于 Dojo 的组件加载过程而延迟。

我的问题是,

  1. 如何阻止“require()”函数,直到它完成执行其回调函数。

因此,当控件从“require()”函数中出来时,变量“myCpane”不会是“未定义”

=================================================== =========

为了解决这个问题,我编写了一个小函数来加载模块并等待模块加载完成

LoadModule: function(modulePath) { // modulePath = "dijit/layout/ContentPane" 
        var moduleObject = undefined; 

        require({async:  false}, [modulePath], function(getModuleObject) { 
                moduleObject = getModuleObject; 
        }); 

        // Wait until the module loads completes 
        while(moduleObject === undefined); 

        // Return the loaded module. 
        return moduleObject; 
} 

函数的输出始终执行 while 循环,控件永远不会进入“require() 的回调函数”以将值设置为变量“moduleObject”。

当“require()”函数调用它的回调函数时?我已经使用浏览器调试器窗口验证了文件“ContentPane.js”已正确加载,但未调用回调函数,如果我注释 while 循环,则会正确调用回调。

在我的例子中,控件何时进入回调函数内部?


我不确定你要实现什么目标,但它看起来像编程反模式 http://en.wikipedia.org/wiki/Anti-pattern#Programming_anti-patterns。无论如何你可以通过以下方式实现这一点dojo/_base/Deferred:

require(["dojo/_base/Deferred"], function(Deferred) {

    var deferred = new Deferred();

    require(["dijit/layout/ContentPane"], function(ContentPane) {
        var myCpane = new ContentPane();
        deferred.resolve(myCpane); //resolve, i.e. call `then` callback
    });

    deferred.then(function(myCpane) {
        console.log(myCpane);
        myCpane.startup();
    });

});​    

在 jsFiddle 上搞乱它:http://jsfiddle.net/phusick/HYQEd/ http://jsfiddle.net/phusick/HYQEd/

我还建议您考虑以下两种策略之一来实现相同的目标:

  1. ContentPane an id并通过 dijit 获取其参考registry.byId().
  2. Create ContentPane单独模块中的实例并将其公开为该模块的返回值:

    // file: myCpane.js
    define(["dijit/layout/ContentPane"], function(ContentPane) { 
        var myCpane = new ContentPane();
        return myCpane;
    });
    
    
    // file: main.js
    require(["./myCpane"], function(myCpane) {
        myCpane.startup();
    });
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dojo 1.7 如何在 require() 之外使用 dojo 组件 的相关文章

随机推荐

  • MVC4 部分视图中的淘汰赛绑定

    简而言之 我相信我所追求的是一种在 MVC4 部分视图中为剔除绑定 javascript 对象提供范围 上下文的方法 这样我就可以重用相同的部分而不会让它们互相干扰 但仍然能够在客户端引用父子视图模型 作为一个出色的菜鸟 更广泛地说 是真正
  • 查找 html 块中最宽单词的宽度

    目标是找到这里最宽单词的宽度 文本是由不同字体的单词组成的句子 如图所示 the html looks like span style font bold 14px Verdana LONGESTW span span style font
  • WSO2 API Manager - 移动应用程序如何连接到 API Manager?

    我们有一个移动应用程序 需要通过 WSO2 API Manager 来访问一些 API 由于oauth2身份验证 我们需要在移动应用程序中存储用户名和密码 安全吗 例如 可以使用用户名和密码登录API Store 对于这种情况有其他解决方案
  • Rails cron 与无论何时,设置环境

    如果您了解用于创建 cron 作业的whengem 这个问题可能才有意义 我的 Schedule rb 中有一个任务 例如 every 1 day at gt 4am do command cd RAILS ROOT rake thinki
  • SQL Server 存储过程能否以比其调用者更高的权限执行?

    我们的 SQL Server 数据库具有报告功能 允许调用者读取但不能写入任何表 因为用户 或者更准确地说 代表用户操作的 Web 应用程序打开的连接 仅具有以下数据读取器权限 数据库 我们希望能够编写一个存储过程 它是一个特殊的 清理报告
  • 为什么使用setTimeout函数会立即执行?

    我正在尝试编写简单的代码setTimeout 但是setTimeout只是不会等待它应该等待的时间并且代码会立即执行 我究竟做错了什么 setTimeout testfunction 2000 您将立即调用该函数并安排其返回值 Use se
  • 神秘的阴谋集团安装问题

    全新安装 Haskell Platform OS X Snow Leopard Platform 2010 1 0 1 这样做会导致简单的序列导致非常奇怪cabal install行为 cabal install time cabal in
  • 如何在 Visual Studio C++ Express 版本中启用自动完成功能?

    请指导我 如何在 VS C 中启用自动完成功能 通过自动完成 我的意思是 当我在控件名称后面加点时 编辑器应该显示一个下拉菜单以供选择 谢谢 开始写作 然后只需按 CTRL SPACE 即可
  • 如何在 Heroku.com 上托管的 Redmine 上安装插件

    刚刚把redmine推送到heroku平台 虽然我无法让积压插件工作 但它在本地工作得很好 我已将本地数据库推送到heroku aswwell Heroku 的公共目录不可写 但默认的 Redmine 假设 要求如此 因为在应用程序服务器启
  • 在 apache Spark 中替换 groupByKey 的方法

    我想知道更换的最佳方法按键分组与另一个操作 基本上我想获得一个RDD int 列表 测量 我的情况 consider measures like RDD of objects measures keyBy getId groupByKey
  • 为什么在自定义 WinRT C++/CX 控件中默认添加 [Windows::Foundation::Metadata::WebHostHidden]?

    当我在 WinRT C CX 项目中创建新控件时 类属性 Windows Foundation Metadata WebHostHidden Visual Studio 2012 默认添加 Example namespace Windows
  • Java:使用 Swing 进行游戏编程

    我对游戏开发比较陌生 我现在已经开发游戏并学习游戏开发2 3个月了 我使用Java 我一直使用 Swing 来制作图形 也就是说 整个游戏都显示在JPanel 用一个Graphics2D目的 到目前为止我没有遇到任何问题 最近 我在最近的项
  • 如何使用 gradle 'api' 依赖项

    我尝试在项目中使用 api 依赖关键字 但收到此错误 指出找不到方法 api 我在一个新项目上尝试过 这是 build gradle 文件 plugins id java group com test version 1 0 SNAPSHO
  • 如何在 wordpress ul 容器周围添加 div

    WordPress 在这个 ul 标签内输出我的子菜单 ul class sub menu 我怎样才能在它周围包裹一个简单的div 最好是通过functions php 来完成此操作 但jquery 也可以工作 虽然使用 jQuery 之类
  • 如何缝合重叠很少的图像?

    我正在尝试使用重叠很少的图像创建全景图 但我知道相机的角度 因此我确切地知道有多少重叠 并且我知道图像的顺序 因此我知道每个图像在全景图中的位置 作为第一步 我只是将图像连接在一起 但结果不够好 有没有办法将位图裁剪为梯形以消除 大部分 重
  • Python 变量的字符串编码

    我知道对于Python u Plants vs Zombies 2 encode utf 8 如果我有一个变量 比如 appName 而不是字符串 我可以这样做吗 appName Plants vs Zombies 2 u appName
  • WiX:补丁安装程序取代以前的版本(1.0.0 -> 1.0.1、1.0.0 -> 1.0.2、1.0.1 -> 1.0.2 等)

    我正在尝试提供一个简单的安装程序包 MSI 我希望通过取代所有以前的补丁的更新 补丁 来支持它 所以我有一个MSI V1 0 0和2个补丁V1 0 1和V1 0 2 用户应该能够只安装最新的补丁 无论系统上已经应用了哪些先前的补丁 我的项目
  • 使用 oAuth2orize 传递“资源所有者密码流”的可信客户端信息

    我在理解如何使用 oAuth2rize 和 Passport js 实现资源所有者密码流程时遇到一些问题 特别是在 client id 和 client secret 的传输方面 以便我可以对客户端进行一些检查 以确保任何内容进入此端点 使
  • 点击情节提要中的按钮时出现不同的图像

    我有一个按钮 我想在突出显示状态下使用不同的背景图像 通常我会使用类似的东西 buttonObject setBackgroundImage UIImage imageNamed buttonDown png forState UICont
  • Dojo 1.7 如何在 require() 之外使用 dojo 组件

    我在 Dojo 1 7 2 中使用 AMD 加载程序创建了如下所示的 Dojo 小部件 var myCpane require dijit layout ContentPane function ContentPane myCpane ne