gpt4 book ai didi

javascript - 在不复制代码的情况下为不同的 Dojo 版本声明不同的类?

转载 作者:行者123 更新时间:2023-11-30 08:02:28 32 4
gpt4 key购买 nike

我有一个为 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 providerequiredeclare 调用可能会导致问题,所以我只测试了将工作代码放在 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com