2015-10-15 4 views
0

Я пытаюсь найти лучший способ получить экземпляр приложения Marionette во всем приложении. Я использую requirejs, однако я не могу понять, можно ли захватить фактический экземпляр приложения через require.Каков правильный способ получить экземпляр приложения Marionette внутри представления?

Я использовал Backbone.Wreqr.EventAggregator и обратные вызовы, чтобы захватить экземпляр приложения, однако он чувствует себя очень грязным.

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

Это в нижней части моего файла данных магистральный:

define('MyApp', ['App'], function (App) { 
    return new App(); 
}); 

require(['MyApp'], function (app) { 
    app.start(); 

    Backbone.history.start({ 
     pushState: true 
    }); 
}); 

Этот код прекрасно работает и загружается приложение, однако в моих взглядах подразделам и других компонентов приложение заканчивает тем, что не определено. Например приложение не определено в этом сценарии:

define([ 
    'marionette', 
    '../controllers/Controller', 
    'MyApp' 
], function (Marionette, Controller, app) { 

    var controller = new Controller(); 

    var Router = new Marionette.AppRouter({ 
     controller: controller, 

     appRoutes: { 
      'home' : 'showUserHome' 
     } 
    }); 

    return Router; 
}); 

ответ

1

Я не уверен, что вы пропустили в вашем приложении, но вы на правильном пути. Ниже приведен рабочий пример, показывающий, что вы можете совместно использовать экземпляр app аналогично тому, как он был опубликован.

define('MyApp', function(){ 
 
    return new Mn.Application(); 
 
}); 
 

 
define('LayoutView', ['MyApp'], function(app){ 
 
    return Backbone.View.extend({ 
 
    render: function(){ 
 
     this.$el.append('App Started'); 
 
     app.trigger('hey:app'); 
 
     return this; 
 
    } 
 
    }); 
 
}); 
 

 
define('StuffOnStart', ['MyApp', 'LayoutView'], function(app, LayoutView){ 
 
    app.on('start', function(){ 
 
    var layoutView = new LayoutView(); 
 
    $(document.body).empty().append(layoutView.render().el); 
 
    }); 
 
}); 
 

 
require(['MyApp', 'StuffOnStart'], function(app){ 
 
    
 
    app.on('hey:app', function(){ 
 
    $(document.body).append('[<code>app</code> object is successfully shared between require.js modules]'); 
 
    }); 
 
    
 
    app.start(); 
 
    
 
});
<script src='http://code.jquery.com/jquery.js'></script> 
 
<script src='http://underscorejs.org/underscore.js'></script> 
 
<script src='http://backbonejs.org/backbone.js'></script> 
 
<script src='https://cdnjs.cloudflare.com/ajax/libs/backbone.marionette/2.4.3/backbone.marionette.js'></script> 
 
<script src='https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.20/require.min.js'></script> 
 
Loading...

+0

Я думаю, что я сузил свою проблему, чтобы быть циклической зависимостью от моего маршрутизатора ... Я буду копать. Большое спасибо за пример кода! – Feek