【发布时间】:2014-08-24 04:29:37
【问题描述】:
我有一个为 IBM Connections 设计的 iWidget,我的 javascript 代码依赖于 Dojo(默认情况下包含在 Connections 中)。
它目前在 Connections 4.0 和 4.5 中工作,但在 Connections 5.0(上周发布)中被破坏,因为 Dojo 已更新到 v1.9 并抱怨我使用 dojo.require。
当我的小部件尝试在 Connections 5.0 上加载时,这些消息会出现在浏览器控制台中:
避免在运行时调用 dojo.require() 来加载类,改用 net.jazz.ajax.xdloader.load_async()。函数“(匿名)”需要类“dojox.atom.io.model”。 避免在运行时调用 dojo.require() 来加载类,请改用 net.jazz.ajax.xdloader.load_async()。函数“(匿名)”需要类“dojox.atom.io.Connection”。
我想制作条件代码,使用不同的方式定义我的小部件类并根据 Dojo 版本需要其他 Dojo 模块。
小部件 javascript 当前如下所示:
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 之后的块,它就会运行。我收到“声明...(旧方法)”和“insightWidgetClass onLoad”控制台消息。
我认为可能将 Dojo provide、require 和 declare 调用包含在任何类型的块中可能会导致问题,所以我测试只是将工作代码放在 if (true) { 块中,它仍然有效.
此时我尝试的最后一件事是在其他所有内容之前添加这一行,看看define 是什么:
console.log('dojo define',define);
... 这打破了它。我的代码中根本没有控制台消息。
然后我从该新行中删除 define 参数,因此它只是向控制台发送一个字符串,并且代码再次工作。
似乎任何提及 define 标识符都会默默地阻止其余代码运行。
控制台中没有指示问题的错误或警告。我只能说:WTF?!
现在返回检查dojo.version。
【问题讨论】:
-
只是一个建议。您可以尝试使用
dojo.version将特定于 dojo 版本的代码包含在内,有关详细信息,请参阅 here。 -
@frank - 我知道
dojo.version对象,但我无法从该文档中看到当只有dojo.provide、dojo.require和dojo.declare行需要针对不同的 Dojo 版本进行更改。
标签: javascript dojo ibm-connections