Javascript require.js-作为参数传递的未定义模块,用于定义回调

Javascript require.js-作为参数传递的未定义模块,用于定义回调,javascript,requirejs,amd,Javascript,Requirejs,Amd,我的应用程序有以下必需的js设置: app.js require.config({ paths: { jquery: '../thirdparty/jquery-1.9.1.min', moment: '../thirdparty/moment', spinningwheel: '../thirdparty/datepicker/spinningwheel', handlebars: '../thirdparty/handl

我的应用程序有以下必需的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();
})
define(['renderview'], function (renderview) {
    //all good here, render view is loaded properly
    return {
        render: function () {
            renderview({...});
        }
    };
})
define(['jquery', 'helpers', 'dom'], function ($, helpers, dom) {
    function renderView(view) {
        var template = helpers.getTemplate(); //ERROR: helpers is undefined!
    }

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

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

    return helpers;
});
history.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();
})
define(['renderview'], function (renderview) {
    //all good here, render view is loaded properly
    return {
        render: function () {
            renderview({...});
        }
    };
})
define(['jquery', 'helpers', 'dom'], function ($, helpers, dom) {
    function renderView(view) {
        var template = helpers.getTemplate(); //ERROR: helpers is undefined!
    }

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

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

    return helpers;
});
renderview.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();
})
define(['renderview'], function (renderview) {
    //all good here, render view is loaded properly
    return {
        render: function () {
            renderview({...});
        }
    };
})
define(['jquery', 'helpers', 'dom'], function ($, helpers, dom) {
    function renderView(view) {
        var template = helpers.getTemplate(); //ERROR: helpers is undefined!
    }

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

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

    return helpers;
});
helpers.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();
})
define(['renderview'], function (renderview) {
    //all good here, render view is loaded properly
    return {
        render: function () {
            renderview({...});
        }
    };
})
define(['jquery', 'helpers', 'dom'], function ($, helpers, dom) {
    function renderView(view) {
        var template = helpers.getTemplate(); //ERROR: helpers is undefined!
    }

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

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

    return helpers;
});
因此,正如您所看到的,helpers在inital app.js回调中加载得很好,但是当我进入renderview.js时,它是未定义的。示例中的依赖关系数组正是我实际代码中的依赖关系数组,但是我已经编辑了所有看似无关的代码。你知道为什么在app.js中可以很好地加载助手,但在renderview.js中却不能加载吗?这是循环依赖吗?在我看来不是这样,但我今天可能在这方面做得太久了:)

谢谢你的帮助和建议

添加当前解决方案,尽管我不知道为什么需要这样做:)


因此,如果不在回调中执行require,而不是将它们指定为依赖项,我就无法正确加载这些模块。我想了解一下原因…

鉴于问题和您的解决方案,您的需求电话中似乎有一些问题。可能您在
helper
模块中需要的某些模块也需要
helpers
模块。

在未淡化的代码中,helpers是否有getTemplate方法?是的,先生。为了清晰起见,我将进行编辑。在renderview.js中,helpers参数是未定义的,而不仅仅是该函数。这项工作正常,但不确定为什么我必须实现此修复。我最终不得不要求使用“require”模块,然后在renderview函数中执行“require('helpers')”。不知道为什么,但这似乎能让事情顺利进行。是的,我唯一想到的可能是它被埋没在函数调用中,无法访问,但我以前从未遇到过requirejs的问题,所以我想不是这样的。将来某一天当你重构的时候,你可能会在你真正想要的解决方案上绊倒。如果这是真的,它不应该被记录下来吗?