0

我对 RequireJS 有一个非常奇怪和令人沮丧的问题。当我为具有依赖项列表的模块调用 require 时,回调中可用的所有依赖项都引用单个模块。这可能更容易用代码解释:

包括 require.js 脚本(没有 data-main 属性)

<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();
});

主页.js

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

搜索栏.js

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

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

有人有想法吗?这是非常明显的事情吗?

编辑:简化示例并提供所有模块源。

4

1 回答 1

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'); 
        }
    };
});
于 2013-04-25T21:59:58.120 回答