2013-10-02 57 views
2

我有包含我的自定义功能,例如一个非AMD的JavaScript加载非AMD脚本时:未捕获的错误:没有定义调用由require.js

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

AMD无法神奇地知道您的脚本输出了什么。 – SLaks

+0

我已经尝试'出口:“自定义”'在'shim'中,但它没有工作。 – Nothing

+0

这些函数是在全局范围内定义的吗?如果是这样,他们是命名空间? – stavarotti

回答

5

Require documentation中描述的这个问题有几个常见的原因。

在这种情况下,很可能是因为您使用的是enforceDefine: true,而“自定义”js文件未调用define()

您需要设置enforceDefine: false或为自定义代码添加合适的垫片。

填充的目的是允许要求加载非AMD代码。它通过加载代码并验证脚本在全局空间中创建属性(如exports属性所定义)来工作。

在你的情况,你可以使用getItemIndexByIdexports值:

shim: { 
    "custom": { 
     exports: "getItemIndexById" 
    } 

当你使用Customexports值,因为你的脚本没有创建一个名为变量没有奏效Custom

查看更多about shimhere

+0

适当的垫片?我应该添加什么适当的垫片? – Nothing

+0

设置'enforceDefine:false',只是没有显示我的控制台中的错误,但它仍然导致'未定义'错误。 – Nothing

+0

@Domo请看上面编辑的垫片示例 – providencemac

相关问题