Приложение Backbone.js + require.js: не возвращается представление модуля, загруженное с помощью require.js

У меня есть два магистральных представления. Один из них является основным видом, а другой — видом, который будет использоваться внутри основного вида. Я делаю отдельные модули для различных представлений. У меня загружается основной вид и он нормально работает с маршрутизатора. Вот два моих взгляда:

ОСНОВНОЙ ВИД:

 define([
    'jquery',
    'backbone',
    'metros/docsMetro'
], 
function($, Backbone, docsMetro) {
    //Main Dashboard View
    var Dashboard = Backbone.View.extend({
            el: $('#mainContent'),
            events: {

            },


            initialize: function() {
                console.log('test');
                //Validate User Here most likely.  Each of the main view's for each app should probably call the same validation function


            },

            render: function (){
                console.log('testing render');

            }

        });


    // Return the Main Dashboard View
    return new Dashboard;

Файл «metros/docsMetro», который загружается с требованием, находится вверху. Я вижу, что это представление загружается и выполняется через файл init.

define([
    'jquery',
    'backbone'
], 
function($, Backbone) {
    //Docs Metro View
    var docsMetro = Backbone.View.extend({
            el: $('.docs'),
            events: {},

            initialize: function() {
                console.log('docs Metro');

            },

            render: function (){
                console.log('redering docs');

            }

        });

    // Return the View
    return new docsMetro;
});

Моя проблема заключается в том, что в основном представлении переменная docsMetro, которая должна быть возвращенным представлением docsMetro, возвращается к нулю.

Что я упускаю, вроде все правильно настроил?


person Collin Estes    schedule 27.01.2012    source источник
comment
Я воссоздал ваш пример, и я смог заставить его работать. Я вижу 2 возможные проблемы в вашем представлении панели инструментов. Во-первых, вы правильно ссылаетесь на metros/docsMetro'. 2-й в представлении панели инструментов вам не хватает }) в конце, но это, вероятно, просто опечатка. Я заметил, что были проблемы, когда я отсутствовал ) в конце представления.   -  person Mike Barlow - BarDev    schedule 28.01.2012
comment
Я добавил свой точный код здесь: gist.github.com/1691229. В моем main.js я использовал require.config для сопоставления путей.   -  person Mike Barlow - BarDev    schedule 28.01.2012


Ответы (1)


Вы можете попробовать установить относительные пути к модулям?

вместо 'metros/docsMetro' сделайте './metros/docsMetro' (при условии, что папка метрос находится на том же уровне, что и файл модуля, из которого вам требуется метрос/docsMetro)

И несколько других советов и исправлений для вашего кода.

Модули должны возвращать конструкторы, а не экземпляры, и вы должны создавать их экземпляры в инициализаторах для представлений, которые их требуют.

jQuery и Backbone не собираются отказываться от поддержки глобальной регистрации своего пространства имен, поэтому вам не нужно каждый раз передавать их в массив зависимостей. Достаточно, если они вам потребуются один раз в boostrap, прежде чем вы загрузите свой маршрутизатор и основной вид, который позаботится о загрузке остальной части приложения.

person Tom Tu    schedule 27.01.2012