2013-04-25 100 views
0

我对RequireJS有一个非常奇怪和令人沮丧的问题。当我调用具有一系列依赖项的模块时,回调中可用的所有依赖项引用一个模块。这可能是与代码更容易解​​释:RequireJS定义回调返回错误的模块依赖关系

包括require.js脚本(没有数据主要属性)

<script type="text/javascript" src="/js/common/require.min.js" ></script> 

下面,我包括我的要求main.js(在网站的所有网页中使用)在回调中需要我的页面特定的js。

<script type="text/javascript"> 
    require(['/js/require/main.js'], function() { 
    require(['page/home_page']); 
    }); 
</script> 

main.js

requirejs.config({ 
    baseUrl: 'js/require' 
}); 

requirejs(['base'], 
function() { 
    var base = require('base'); 
    base.init(); 
}); 

home_page.js

define(['home','searchbar'], function (home,searchbar){ 

    console.log(home.init == searchbar.init); // This is always true !!! 

    home.init(); 
    searchbar.init(); 
}); 

home.js

define(function(){ 
    this.init = function(){ 
    console.log('in home page'); 
    } 
    return this; 
}); 

searchbar.js

define(function(){ 
    this.init = function(){ 
    console.log('Now in the searchbar init') 
    } 
    return this; 
}); 

问题出在home_page.js模块home和searchbar引用同样的东西。奇怪的是,现在我已经简化了这个例子,它看起来很随机,它选择了哪一个。大多数时候它是搜索栏,但每隔几次刷新它就会回家。

任何人有想法?这件事显而易见吗?

编辑:简化的例子,并提供所有模块的来源。

+0

那是你的全'requirejs.config'?你可以显示搜索栏,家庭和帐户模块文件? – 2013-04-25 06:34:58

+0

@PaulGrime,问题已修改 – JoeyP 2013-04-25 21:55:21

回答

2

您正在分配到两个模块中的this。这不是一个好主意(原谅双关)。在两种情况下,this都可能是window对象。您可以通过添加一个

window.init === searchbar.init 

测试。

重写模块返回唯一对象,像这样:

define(function() { 
    return { 
     init: function() { 
      console.log('in home page'); 
     } 
    }; 
}); 

define(function() { 
    return { 
     init: function() { 
      console.log('Now in the searchbar init'); 
     } 
    }; 
}); 
+0

Blah,yep,就是这样。不知道为什么,但我认为回调可能有自己的范围。 – JoeyP 2013-04-25 23:30:07