如何同步/组织使用requirejs和Backbone.Marionette模块(How to sy

2019-07-30 01:48发布

我安排我的web应用程序,这是使用的文件结构RequireJs和Backbone.Marionette ,以这种方式:

|- main.js
|- app.js
|- /subapp1
    |- subapp1.js
    |- subapp1.router.js
|- /subapp2
    |- subapp2.js
    |- subapp2.router.js
|- /colections
|- /views

要加载的模块我用requireJs。
这里是我的代码,每个模块,我把一些问题。


// main.js
define([
    'app',
    'subapp1/subapp1.router',
    'subapp2/subapp2.router'
], function (app) {
    "use strict";
    app.start();
});

问题:
1)是正确的异步加载应用程序和subapps即使subapps需要的应用程序?
2)用于subApps是正确加载这就需要该应用路由器?


// app.js
/*global define*/
define([
    'backbone',
    'marionette',
    'models/user'
], function (Backbone, Marionette, UserModel) {
    "use strict";

    var App = new Marionette.Application();

    App.addRegions({
        header: '#header',
        sidebar: '#sidebar',
        mainColumn: '#main-column',
        rightColumn: '#right-column'
    });

    App.on("initialize:before", function () {
        this.userModel = new UserModel();
        this.userModel.fetch();
    });

    App.on("initialize:after", function () {
        Backbone.history.start();
    });

    return App;
});

问题:
3)由于subApps可能需要一些models ,我决定将其加载到app.js 。 是不是这样?


// subapp1/subapp1.js
/*global define*/
define([
    'app',
    'subapp1/views/sidebarView',
    'subapp1/views/headerView'
], function (app, SidebarView, HeaderView) {
    "use strict";

    app.addInitializer(function(){
        app.header.show(new HeaderView({userModel: app.userModel}));
        app.sidebar.show(new SidebarView({userModel: app.userModel}));
    });

});

问题:
4)关于这个模块,我不知道的app.addInitializer
我不知道,例如,如果app.userModel当我执行将获取app.header.show 。 它应该是好吗?


// subapp1/subapp1.router.js
/*global define*/
define([
    'marionette',
    'tasks/app'
], function (Marionette, app) {
    "use strict";
    var Router = Marionette.AppRouter.extend({

        appRoutes: {
            'tasks': 'tasks',
            'tasks/:id': 'taskDetail',
            '*defaults': 'tasks'
        }

    });

    return new Router({
        controller: app
    });
});

题:
5)它确定从负载main.jssubapp1/subapp1.router代替subapp1/subapp1

Answer 1:

1)是正确的异步加载应用程序和subapps即使subapps需要的应用程序?

您应该能够异步加载您的app和任何的sub-apps 。 如果sub-apps所需要的主要app ,就应该将其列为依赖。 RequireJS将解决依赖你。

你唯一要注意是圆形的依赖,但不应该是任何东西无法修复。

2)用于subApps是正确加载这就需要该应用路由器?

清单的routers你的sub-apps在你的main.js听起来我的权利。

3)由于subApps可能需要一些models ,我决定将其加载到app.js 。 是不是这样?

一个模块应该列出任何和它使用作为其依赖的所有其它模块。 因此,如果app.jssubapp1/subapp1.js都需要models/user.js ,他们都很列表models/user.js作为自己的一个依赖。

这样一来,如果你改变任何一个模块以这样一种方式,它不再需要models/user.js ,你可以从该特定模块的依赖,而不在其他模块中缺少依赖的风险。

除了是管理您的依赖的是救的方式,这也是很好的和明确为其他开发商甚至自己在将来的代码看时。

4)关于这个模块,我不知道的app.addInitializer

我不知道,例如,如果app.userModel当我执行将获取app.header.show 。 它应该是好吗?

获取数据应手动启动。 同时显示在一个视图Region并触发View被渲染,它不会触发视图的ModelCollection来获取数据。

你可以做的,就是让你的view听取他们对你的事件ModelCollection和重新渲染视图一旦ModelCollection已经成功地获取新的数据。 木偶的CollectionView自动绑定一些事件来addchangeremove事件,它是Collection在奥德自动管理它的ItemViews如果Collection以任何方式改变。

5)它确定从负载main.jssubapp1/subapp1.router代替subapp1/subapp1

正如我在问题2已经说过,这是很好的加载路由器main.js

原因之一要做到这一点,是你可以决定不加载所有的sub-apps了前面,但一旦他们真正需要的,而不是只加载它们。 这样的时刻sub-app的途径被触发是一个很好的时间,任何来加载sub-app的核心模块,可能它的一些相关性,但会的,当然需要的sub-appRouter在之前被激活sub-app被加载。



文章来源: How to synchronise/organise modules using requirejs and Backbone.Marionette