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

Gre*_*eg 5 javascript amd requirejs

我的应用程序有以下需要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();
})
Run Code Online (Sandbox Code Playgroud)

history.js

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

renderview.js

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

    return renderView;
});
Run Code Online (Sandbox Code Playgroud)

helpers.js

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

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

    return helpers;
});
Run Code Online (Sandbox Code Playgroud)

所以,正如你所看到的,helper在inital 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;
});
Run Code Online (Sandbox Code Playgroud)

所以,我不能让这些模块无需做需要正确加载内部的回调,而不是指定它们作为一个依赖.会喜欢一些洞察力,为什么会这样......

And*_*rle 1

考虑到问题和您的解决方案,您的 require 调用中似乎存在循环依赖。也许您在模块中需要的某些模块helper也需要该helpers模块。

  • 如果这是真的,难道不应该记录下来吗? (3认同)