2013-09-12 2 views
0

Я столкнулся с странной проблемой в приложении requirejs/backbonejs. У меня есть файл Globals.js, который возвращает утилиты многократного использования. Это выглядит примерно так.requirejs, включая модуль, который возвращает объект в другом подобном модуле

define(
['newapp/routers/index', 'newapp/controllers/index', 'newapp/utilities'], 
function(Router, Controller, Utilities) { 
    return { 
     router: new Router({controller: Controller}), 
     utilities: Utilities, 
     navigate: function(path, opts) { 
      this.router.navigate('app/' + path, opts); 
     } 

    } 

}) 

Когда я требую этого модуля в модулях, которые возвращают магистральные просмотры, она способна решить Globals на объект и вызвать его методу. Однако, когда я пытаюсь включить его в модуль, который возвращает другой объект, он разрешен до undefined.

Например приведенный ниже код способен решить Globals к свойствам он подвергает

define(
['marionette', 'templates', 'newapp/globals', 'newapp/views/Loader'], 
function(M, T, Globals, mixins){ 
    "use strict"; 

    return M.ItemView.extend(
     _.extend({}, mixins, { 

      template: T.brandPageInfo, 
      events: { 
       'click #getProductsForBrands': 'getProductsForBrands', 
       'click button[id^="goto__"]': 'actionOnGotoButtons' 
      }, 
      onRender: function() { 
       this.flatIconsOnHover(); 
      }, 
      getProductsForBrands: function(e) { 
       e.preventDefault(); 
       var searchQuery = this.model.get('name'); 
       Globals.navigate('search?q=' + searchQuery, {trigger: true}); 
      } 
     }) 
    ) 
}) 

Но приведенный ниже код выдает ошибку: Globals является undefined

define(
[ 
    'newapp/collections/Boards', 'newapp/globals' 
], 
function(
    BoardsCollection, Globals 
    ) { 
    var boardsList; 

    return { 
     ensureBoardList: function() { 
      var defer = $.Deferred(); 

      if (!boardsList || (boardsList && !boardsList.length)) { 
       boardsList = new BoardsCollection(); 
       boardsList.fetch({ 
        data: {_: (new Date()).getTime()}, 
        success: function (boardsListCbData) { 
         boardsList = boardsListCbData; 
         defer.resolve(boardsList); 
        } 
       }) 
      } else { 
       defer.resolve(boardsList); 
      } 

      return defer.done(function (boardsList) { 
       //make the boardsList usable for direct UI rendering by any view 
       return Globals.utilities.getFormattedBoardsCollection(boardsList); 

      }); 
     } 


    } 
}) 

Как сделать Globals доступным во втором примере?

ответ

0

Убедитесь, что у вас нет никаких циклических зависимостей например:

  • Глобал зависят от newapp/controllers/index
  • newapp/controllers/index зависит от последнего модуля вы отображаемым (мы будем называть его модуль M)
  • модуля M зависит от глобального

Поскольку каждый модуль зависит от другого, единственное, что может потребовать RequireJS, - установить один из них на undefined на "br eak the cycle "и получить другие модули для загрузки.

Насколько я могу судить, это наиболее вероятный источник вашей проблемы, а не тот факт, что вы возвращаете другой объект.

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