gpt4 book ai didi

architecture - MarionetteJS 和 "Sub Applications"

转载 作者:行者123 更新时间:2023-12-03 15:14:51 25 4
gpt4 key购买 nike

我正在开发一个具有多个不同功能区域的 MarionetteJS Web 应用程序。例如,一个是“仪表板”,另一个是“组”,第三个是“事件”,每个都有自己的特定路线。

例如。

  • /dashboard#show
  • /groups#list
  • /groups#show/123
  • /events#v/9876/参加者

  • 等等

    过去,我使用 Marionette 模块将主应用程序对象分割成可以启动和停止的部分。当正在开发的应用程序是 100% 单页应用程序时,这很有用 - 这意味着我可以从服务器加载 MVC 路由(例如 http://example.com/dashboard )并启动适当的 Marionette 组件。 http://example.com/groups将启动一组不同的 Marionette 组件

    在其当前状态下(在撰写本文时,2.4.2)Marionette 已弃用 Module 组件以支持其他模块加载机制。在上面给出的示例中,是否仍然可以使用不同的架构方法将 Marionette 应用程序分割成多个片段以独立触发?在我看来,我可以:
  • 创建多个 Marionette.Application() 对象并相互独立地加载它们。
  • 利用 Marionette.Object() 并以某种方式将 Marionette.Application() 对象扩展为子组件。
  • 创建一个“主”路由器来监听根 url(事件/、仪表板、组),然后创建“子路由器”来扩展它以提供更多功能。
  • 最佳答案

    我会使用 CommonJS 模块采用以下方法。这些子应用程序或模块无法启动或停止,但它们提供了很好的分离。

    app.js

    var Marionette = require('backbone.marionette');
    var _ = require('underscore');

    module.exports = Marionette.Application.extend({
    initialize: function() {
    this._modules = [];
    },

    addModule: function(name, klass ,options) {
    var module = new klass(options);

    this._modules[name] = module;
    }
    });

    布局.js
    var Marionette = require('backbone.marionette');

    module.exports = Marionette.LayoutView.extend({
    el: '#app',

    regions: {
    header: '[data-region="header"]',
    main: '[data-region="main"]'
    }
    });

    组/index.js
    var Marionette = require('backbone.marionette');

    var Router = require('./router');

    var Group = require('./model/group');
    var GroupCollection = require('./model/group_collection');

    var GroupListView = require('./list/collection_view');
    var GroupDetailView = require('./detail/group_view');

    module.exports = Marionette.Object.extend({
    initialize: function(options) {
    this.container = options.container;

    this.router = new Router({
    controller: this
    });

    this.groups = new GroupCollection();
    },

    groupList: function() {
    var groupListView = new GroupListView({
    collection: this.groups
    });

    this.groups.fetch();

    this.container.show(groupListView);
    },

    groupDetail: function(id) {
    var groupDetailView = new GroupDetailView({
    model: this.groups.findWhere({id: id})
    });

    this.container.show(groupDetailView);
    }
    });

    组/router.js
    var Marionette = require('backbone.marionette');

    module.exports = Marionette.AppRouter.extend({
    appRoutes: {
    'groups': 'groupList',
    'groups/:id': 'groupDetail'
    }
    });

    main.js
    var Backbone = require('backbone');

    var Application = require('./app');
    var MainLayout = require('./layout');

    var HeaderApp = require('./header');
    var GroupsApp = require('./groups');

    var app = new Application();
    var layout = new MainLayout();

    app.addModule('header', HeaderApp, {
    container: layout.getRegion('header')
    });

    app.addModule('groups', GroupsApp, {
    container: layout.getRegion('main')
    });

    app.start();

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

    我省略了这个例子中的模型、集合和 View ,但我希望你能明白要点。

    您的应用程序是一个扩展的 Marionette 应用程序,您可以在其中注册模块。

    每个模块都存在于它自己的文件夹中,其中包含一个 index.js 文件,该文件用作模块的入口点。在此文件中,您构建了一个 Marionette 对象,该对象用作模块的 Controller 。

    每个模块都有自己的路由器,index.js 文件中的 Marionette 对象作为它的 Controller 。

    随意添加模型、集合、 View 和模板。对于模块之间的通信,您可以使用 Backbone.Radio。

    最后,您在 main.js 中引导您的应用程序、主布局和模块,并使用 browserify 或 webpack 构建它。

    免责声明

    我自己没有发明这种架构,但目前我不记得原始来源。

    关于architecture - MarionetteJS 和 "Sub Applications",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32426138/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com