2013-10-02 26 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

相關問題