2013-08-05 60 views
2

我正在使用require Js,并且对于为什么我的模块正在加载但依赖关系总是未定义,甚至在使用require.defined()函数来检查模块是否已加载它确实具有但是当我使用require([deps],function(deps){});所有我的依赖关系是不确定的(除了jquery的,下划线和敲除)RequireJs依赖始终未定义

我的文件结构如下 我的文件结构如下

scripts 
    | 
    |   
    main.js 
    | 
    |_________BusinessScripts 
    |   | 
    |   | 
    jquery.js | 
    |   | 
    |   boostrapper.js-undefined 
    ko.js  | 
       | 
       dataservice.js-undefined 

这是我的主文件的一个例子序幕需要

requirejs.config(
    { 
     paths: { 
      'jquery': 'jquery-1.7.1', 
      'underscore': 'underscore', 
      'ko': 'knockout-2.2.1' 
     }, 
     shim: { 
      underscore: { exports: '_' }, 
     } 
    } 
); 


requirejs(['require', 'BusinessScripts/bootstrapper', 'BusinessScripts/dataservice'], 
function (require,bootstrapper, dataservice) { 

    var def = require.defined('BusinessScripts/bootstrapper'); //this returns true 

    if (dataservice !== undefined) { // always undefined 

     alert("Loaded properly"); 
    } else { 
     alert("not loaded!!!"); 
    } 

    if (bootstrapper !== undefined) { // always undefined 


     alert("Loaded properly"); 
    } else { 
     alert("not loaded!!!"); 
    } 

}); 

我的数据服务类也相当漫长的jQuery得到,但作为一个简单的例子,我的引导程序旁边做着什么

//bootstrapper 
define(function() { var one = 1; 
var run = function() { 
} 
}); 

//dataservice 

define(['jquery', 'underscore'],function ($, _) { 
    $.ajax({lengthy work...}); 

}); 

正如我所说的这两个模块被加载但从未解决

任何帮助,将不胜感激。

回答

5

您不会从您的bootstrapperdataservice模块返回任何内容,因此模块的“公共”部分为undefined。 RequireJS只是执行define函数的主体并隐式返回undefined。我认为一个很好的比喻是将模块看作是一个黑盒子,其内部隐藏着所有内部组件,只允许通过公共接口访问(这是您从模块的最终return声明返回的任何内容)

您应该重新编写模块,例如:

bootstrapper.js

define(function() { 
    var one = 1; 
    var run = function() { 
    console.log('Running...'); 
    } 

    return { 
    publicRun: run, 
    publicOne: one 
    } 
}); 

dataservice.js

define(['jquery', 'underscore'],function ($, _) { 
    $.ajax({ 
    // lengthy work... 
    }); 

    return 'Lengthy work started!'; 
}); 

然后,你可以使用这些模块是这样的:

requirejs(['require', 'BusinessScripts/bootstrapper', 'BusinessScripts/dataservice'], 
    function (require, bootstrapper, dataservice) { 
    // prints "1" 
    console.log(dataservice.publicOne); 

    // prints "Running..." 
    dataservice.publicRun(); 

    // prints "Lengthy work started!" 
    console.log(bootstrapper); 
    }); 

official docs涵盖了详细定义模块的话题,我建议你在潜水前阅读尽可能多的文档尽可能

+0

现货!现在它非常明显 – Infolord101