require.js — неопределенные модули, переданные в качестве аргументов для определения обратного вызова

У меня есть следующая настройка js для моего приложения:

app.js

require.config({
    paths: {
        jquery: '../thirdparty/jquery-1.9.1.min',
        moment: '../thirdparty/moment',
        spinningwheel: '../thirdparty/datepicker/spinningwheel',
        handlebars: '../thirdparty/handlebars',
        colorgenerator: '../usercolors',
        baseconfig: '../config'        },
    shim: {
        'baseconfig': [],
        'spinningwheel': {
            deps: [],
            exports: 'SpinningWheel'
        },
        'handlebars': {
            deps: [],
            exports: 'Handlebars'
        }

    }
});


require(['jquery', 'dom', 'helpers', 'actions', 'history', 'store'], function ($, dom, helpers, actions, hist, store) {
    //all good on the home front at this point
    //all modules loaded properly
    history.render();
})

история.js

define(['renderview'], function (renderview) {
    //all good here, render view is loaded properly
    return {
        render: function () {
            renderview({...});
        }
    };
})

рендервью.js

define(['jquery', 'helpers', 'dom'], function ($, helpers, dom) {
    function renderView(view) {
        var template = helpers.getTemplate(); //ERROR: helpers is undefined!
    }

    return renderView;
});

helpers.js

define(['jquery', 'handlebars', 'history', 'dom', 'colorgenerator'], function ($, Handlebars, history, dom, ColorGenerator) {
    var helpers = {};

    helpers.getTemplate = function () {
       //do stuff
    };

    return helpers;
});

Итак, как вы можете видеть, хелперы нормально загружаются в начальном обратном вызове app.js, но когда я попадаю в renderview.js, он не определен. Массивы зависимостей в примере точно такие же, как и в моем реальном коде, однако я отредактировал весь на первый взгляд нерелевантный код. Любые идеи, почему хелперы будут нормально загружаться в app.js, но не в renderview.js? Это круговая зависимость? Мне это не кажется, но я, возможно, слишком долго этим занимался сегодня :)

Спасибо за любую помощь или предложения!

Добавляю текущее решение, хотя не знаю, зачем мне это нужно :)

define(['require', 'jquery', 'dom'], function (require, $, dom) {
    function renderView() {
        //responsible for rendering our view
        var helpers = require('helpers');
        var history = require('history');

        var v = history.get();
        ...
        tmpl = helpers.getTemplate(v.template);
        ...
    }

    return renderView;
});

Таким образом, я не мог заставить эти модули загружаться должным образом, не выполнив требование внутри обратного вызова, а не указав их как зависимость. Хотелось бы понимания, почему так...


person Greg    schedule 11.08.2013    source источник
comment
В неразбавленном коде есть ли у хелперов метод getTemplate?   -  person Josh    schedule 11.08.2013
comment
да сэр. Я отредактирую для ясности. Однако в renderview.js аргумент helpers не определен, а не только эта функция.   -  person Greg    schedule 11.08.2013
comment
У меня это работает, но я не уверен, почему мне пришлось реализовать это исправление. В итоге мне пришлось потребовать модуль require, а затем выполнить require('helpers') из функции renderview. Не уверен, почему, но, кажется, это заставляет вещи работать.   -  person Greg    schedule 11.08.2013
comment
Да, единственное, о чем я думал, это то, что, возможно, он был похоронен в вызовах функций и недоступен, но у меня никогда раньше не было такой проблемы с requirejs, поэтому я решил, что это не так. Однажды в будущем, когда вы будете проводить рефакторинг, вы, вероятно, наткнетесь на решение, которое вы действительно хотели.   -  person Josh    schedule 11.08.2013


Ответы (1)


Учитывая проблему и ваше решение, похоже, что у вас есть циклическая зависимость где-то в вашем запросе звонки. Возможно, некоторые из модулей, которые вам требуются в модуле helper, также требуют модуля helpers.

person Andreas Köberle    schedule 11.08.2013
comment
Если это правда, разве это не должно быть зарегистрировано? - person user239558; 16.10.2013