- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个为 IBM Connections 设计的 iWidget,我的 javascript 代码依赖于 Dojo(它默认包含在 Connections 中)。
它目前在 Connections 4.0 和 4.5 中工作,但在 Connections 5.0(上周发布)中被破坏,因为 Dojo 已更新到 v1.9 并提示我使用 dojo.require
。
当我的小部件尝试在 Connections 5.0 上加载时,这些消息会出现在浏览器控制台中:
Avoid calling dojo.require() to load classes at runtime, use net.jazz.ajax.xdloader.load_async() instead. Function '(anonymous)' required class 'dojox.atom.io.model'.Avoid calling dojo.require() to load classes at runtime, use net.jazz.ajax.xdloader.load_async() instead. Function '(anonymous)' required class 'dojox.atom.io.Connection'.
I want to make conditional code that uses different ways of defining my widget class and requiring other Dojo modules depending on the Dojo version.
The widget javascript currently looks like this:
dojo.provide('insightCommunityWidgetClass');
dojo.require('dojox.atom.io.model');
dojo.require('dojox.atom.io.Connection');
dojo.declare('insightCommunityWidgetClass',null,{
// Class fields and methods. Currently 680 lines uncompressed.
});
我还没有创建适用于 Dojo 1.9/Connections 5.0 的版本,但我认为它看起来像这样(我必须使我的 javascript 文件名与所需的类名匹配):
define(['dojo/_base/declare','dojox.atom.io.model','dojox.atom.io.Connection'], function(declare){
return declare(null, {
// Class fields and methods.
});
});
如何在不复制类主体的情况下将这两个放在一个文件中并在它们之间进行选择?
更新:
我已经尝试了一些条件代码,按照 Dimitri 的建议检查 (define && define.amd)
,在 Connections 4.0 和 4.5 上测试了它,并且出现了非常奇怪的行为。
暂时忽略任何不复制我的类的尝试,这里是一些我完全按照所示使用的条件代码,具有严重减少的小部件类:
if (define && define.amd) {
console.log('Declaring insightWidgetClass with AMD (new method).');
define(['dojo/_base/declare','dojox/atom/io/model','dojox/atom/io/Connection'],
function(declare){
return declare(null,{
SVC_INV: 1,
onLoad: function() {
console.log('insightWidgetClass onLoad.');
}
});
}
);
} else {
console.log('Declaring insightWidgetClass with dojo.declare (old method).');
dojo.provide('insightWidgetClass');
dojo.require('dojox.atom.io.model');
dojo.require('dojox.atom.io.Connection');
dojo.declare('insightWidgetClass',null,{
SVC_INV: 1,
onLoad: function() {
console.log('insightWidgetClass onLoad.');
}
});
}
这似乎根本无法运行。我的 console.log
消息都没有出现在浏览器控制台中。
如果我注释掉条件并使其成为唯一事件代码是 else
之后的 block ,它就会运行。我收到“声明...(旧方法)”和“insightWidgetClass onLoad”控制台消息。
我认为在任何类型的 block 中包含 Dojo provide
、require
和 declare
调用可能会导致问题,所以我只测试了将工作代码放在 if (true) {
block 中,它仍然有效。
此时我尝试的最后一件事是在其他所有内容之前添加这一行,以查看 define
是什么:
console.log('dojo define',define);
... 这打破了它。我的代码中根本没有控制台消息。
然后我从该新行中删除了 define
参数,因此它只向控制台发送了一个字符串,代码再次运行。
似乎任何提及define
标识符都会默默地停止其余代码的运行。
控制台中没有指示问题的错误或警告。对此我只能说:WTF?!
现在返回检查 dojo.version
。
最佳答案
通常两者都应该仍然有效,dojo.provide()
和 dojo.require()
已被弃用,但并未完全删除。只需确保您的加载 dojo 处于同步模式。
除此之外,在 Dojo 1.7 中引入了 AMD 编码方式,这意味着 IBM Connections 4.5 也应该支持它(虽然我不知道 IBM Connections 4)。
但是如果你真的想使用两个代码库,你可以简单地引用同一个对象而不是复制它,例如:
var myModule = {
// Class fields and methods.
};
if (dojo.version.major == 1 && dojo.version.minor == 9) {
define(['dojo/_base/declare','dojox.atom.io.model','dojox.atom.io.Connection'], function(declare){
return declare(null, myModule);
});
} else {
dojo.provide('insightCommunityWidgetClass');
dojo.require('dojox.atom.io.model');
dojo.require('dojox.atom.io.Connection');
dojo.declare('insightCommunityWidgetClass',null, myModule);
}
或者您可以使用以下检查:
if (typeof define === 'function' && define.amd) {
// AMD style code
} else {
// Non-AMD style code
}
这是大多数交叉加载程序库使用的方法。既适用于 AMD 加载器(Dojo、Require.js),也适用于 Node.js 或仅通过使用全局命名空间的库使用类似的代码段来确定它们如何加载模块。
关于javascript - 在不复制代码的情况下为不同的 Dojo 版本声明不同的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24547092/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!