0

我在 requirejs/backbonejs 应用程序中遇到了一个奇怪的问题。我有一个Globals.js返回可重用实用程序的文件。它看起来像这样。

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);
        }

    }

})

当我在返回主干视图的模块中需要此模块时,它能够将全局解析为一个对象并在其上调用方法。但是,当我尝试将它包含在返回另一个对象的模块中时,它被解析为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});
            }
        })
    )
})

但是下面的代码给出了一个错误:Globalsundefined

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在第二个示例中如何使可访问?

4

1 回答 1

0

确保你没有任何循环依赖,例如:

  • 全局变量取决于newapp/controllers/index
  • newapp/controllers/index取决于您显示的最后一个模块(我们将其称为模块 M)
  • 模块 M 依赖于全局

由于每个模块都依赖于另一个模块,RequireJS 唯一能做的就是将其中一个设置undefined为“打破循环”并让其他模块加载。

据我所知,这是您问题的最可能根源,而不是您返回另一个对象的事实。

于 2013-09-13T11:53:30.377 回答