更新 Dojo 提供

Posted

技术标签:

【中文标题】更新 Dojo 提供【英文标题】:Updating Dojo provide 【发布时间】:2013-10-21 20:35:14 【问题描述】:

我在一个项目中使用 Dojo 1.9,但与传统风格相比,我不明白 AMD 风格中 dojo.provide 的正确替代方案。我正在阅读 this 文档页面。

很明显,这就是旧语法映射到新语法的方式:

dojo.provide("acme.Dialog");
dojo.require("dijit._Widget");
dojo.require("dojo.date");
CODE HERE

define(["dijit/_Widget", "dojo/date"], function(_Widget, date)   ....
     CODE HERE
     return MyWidget;
);

我不确定我作为 MyWidget 返回的究竟是什么。我的代码如下所示:

define(["dojo/foo/x","dojo/foo/y"], function(x, y)
    dojo.provide("my.module");     
);

我应该在这里返回什么?

【问题讨论】:

【参考方案1】:

这是一个非常棒的教程,“现代道场”:

http://dojotoolkit.org/documentation/tutorials/1.7/modern_dojo/

好的报价:

如果您发现自己在输入 dojo.* 或 dijit.* 或 dojox.*,那么 不对。

更改 AMD 的基本理由:

“现代”道场的核心概念之一是全球范围内的事物 命名空间不好。这有很多原因,但在一个 复杂的 Web 应用程序,全局命名空间很容易变成 被各种代码污染,尤其是当很多 组织使用多个 javascript 框架。我什至不会提及 从安全的角度来看可能发生的邪恶事情 人们故意修改全局命名空间。这意味着在 “现代”道场,如果您要访问全球范围内的某些东西 namespace STOP 因为你做错了什么。

...

另一个核心概念是同步操作很慢并且 异步的通常更快。 “遗产”道场已经有了 在异步 JavaScript 代码中相当强大的血统与 dojo.Deferred 的概念,但在“现代”Dojo 中,最好能想到 一切都是异步操作的。

...

为了加强 Dojo 的模块化并利用上述概念, 在 1.7 Dojo 中采用了称为 Asynchronous 的 CommonJS 模块定义 模块定义 (AMD)。这意味着对 Dojo 进行了根本性的重写 模块加载器,通常通过 require() 和 定义()函数。您可以在以下位置找到加载程序的完整文档 参考指南..这从根本上改变了代码的方式 结构化。

【讨论】:

感谢您的回复。我正在浏览此页面,但由于我按照 Dojo 1.7 文档 (dojotoolkit.org/reference-guide/1.7/dojo/provide.html) 编写代码而感到困惑。我不确定我应该如何正确修改我的代码。 所以如果我没记错的话,我应该在定义中做return declare("my.module",[my.module],);,对吧? 实际上,我不确定您是否需要“定义()”或“返回”任何内容。此链接也可能有帮助:dojotoolkit.org/reference-guide/1.9/quickstart/…。它也使用新的 AMD 语法。 我明白了,谢谢你的帮助。!在继续之前,我可能会多读一点。文档让我有点困惑 :) (顺便说一句,你的意思是 'declare' 还是“返回”任何东西?)【参考方案2】:

在 AMD 中没有与 dojo.provide 等价的东西。此调用只需要通知系统的某些部分您打算从文件内的全局范围内的给定位置创建对象。现在我们使用基于文件名的 AMD 模块 ID 来执行此操作。

在 AMD 模块的工厂函数中,您可以返回任何内容,也可以不返回任何内容。如果你返回一些东西,它就会成为模块的值。所以,在旧版中:

一个没有定义的模块:

dojo.provide("app.nothing");
// some code

会变成:

// in app/nothing.js
define([], function () 
    // some code
);

定义对象的模块:

dojo.provide("app.myModule");
app.myModule =  foo: "foo" ;

会变成:

// in app/myModule.js
define([], function () 
    return  foo: "foo" ;
);

还有一个使用declare定义构造函数的模块:

dojo.provide("app.MyClass");
dojo.require("dijit._WidgetBase");
dojo.declare("app.MyClass", dijit._WidgetBase, );

会变成:

// in app/MyClass.js
define([ "dojo/_base/declare", "dijit/_WidgetBase" ], function (declare, _WidgetBase) 
    return declare(_WidgetBase, );
);

【讨论】:

感谢您的帮助!我只是在查看Dojo Upgrade Hints 时发现了这一点。 @paulsm4 的回答也很有帮助。混乱是因为Dojo Provide documentation in 1.7

以上是关于更新 Dojo 提供的主要内容,如果未能解决你的问题,请参考以下文章

使用指定的 x 和 y 值更新动态 Dojo 图表

DoJo 增强的网格动态更新约束不起作用

如何通过按 Enter 使用 Dojo 和 XHR 发送 Zend 表单

ArcGIS API for JavaScript 与Dojo的关系

初学ArcGIS API for JavaScript

dojo源码阅读之dojo/Stateful