我有一个非AMD的javascript包含我的自定义函数,例如:
function getItemIndexById(items, id){
for(var i = 0; i < items.length; i++){
if(items[i].ID == id) return i;
}
return false;
}
//more than one define custom function here.
这里是main.js文件:
requirejs.config({
enforceDefine: true,
paths: {
"jquery": "libs/jquery/jquery-min",
"underscore": "libs/underscore/underscore-min",
"backbone": "libs/backbone/backbone-min",
"custom" : "libs/scripts/customejs"
},
shim: {
"underscore": {
deps: [],
exports: "_"
},
"backbone": {
deps: ["jquery", "underscore"],
exports: "Backbone"
}
}
});
然后我在我的观点中定义:
define(["jquery" ,
"underscore" ,
"backbone" ,
"custom"
],function($ , _ , Backbone, Custom){
//.....
}
我在Uncaught Error: No define call for custom
收到错误。
我是否必须将自定义js转换为AMD?请问有人能解释一下这个问题。感谢。
答案 0 :(得分:7)
Require documentation中描述了此问题的一些常见原因。
在这种情况下,很可能是因为您使用enforceDefine: true
而“自定义”js文件未调用define()
。
您需要设置enforceDefine: false
或为自定义代码添加适当的垫片。
填充程序的目的是允许要求加载非AMD代码。它的工作原理是加载代码并验证脚本是否在exports
属性定义的全局空间中创建了属性。
在您的情况下,您可以使用getItemIndexById
作为exports
值:
shim: {
"custom": {
exports: "getItemIndexById"
}
当您使用Custom
作为exports
值时,它不起作用,因为您的脚本未创建名为Custom
的变量
详细了解shim
here