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

しかし、以下のコードはエラーになります: Globalsisundefined

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

            });
        }


    }
})

Globals2 番目の例でアクセス可能にするにはどうすればよいですか?

4

1 に答える 1

0

循環依存関係がないことを確認してください。

  • グローバルが依存するnewapp/controllers/index
  • newapp/controllers/index最後に表示したモジュールによって異なります (モジュール M と呼びます)。
  • モジュール M は global に依存します

各モジュールは他のモジュールに依存しているため、RequireJS ができる唯一のことは、それらの 1 つをundefined「サイクルを壊す」ように設定し、他のモジュールをロードすることです。

私が知る限り、これはあなたの問題の最も可能性の高い原因であり、別のオブジェクトを返しているという事実ではありません。

于 2013-09-13T11:53:30.377 に答える