2013-04-25 2 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, и в справочной системе поиска то же самое. Странно, что теперь, когда я упростил этот пример, он кажется довольно случайным, который он выбирает. В большинстве случаев это поисковая система, но каждые несколько обновлений он будет дома.

У кого-нибудь есть идеи? Это что-то ужасно очевидно?

EDIT: упрощенный пример и предоставлен весь источник модуля.

+0

Это ваш полный 'requirejs.config'? Можете ли вы отобразить файлы в поисковой, домашней и учетной записи? –

+0

@PaulGrime, вопрос был изменен – JoeyP

ответ

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

Бла, да, вот что это было. Не знаю, почему, но я думал, что обратные вызовы могут иметь свой собственный охват. – JoeyP

Смежные вопросы