如何使用requireJs定义正确的顺序控制器,路由器和应用(How to define contr

2019-09-18 04:59发布

我写一个小的应用程序( initApp.jsinitApp.routinj.jsinitApp.controller.js )哪些模块需要使用,需要被加载。
这里是我的代码(*)。
使用console.log在我看到模块是如何加载顺序如下每个模块:

1) initController 
2) initRouting 
3) initApp 

这是正确的顺序?

现在,另一个问题。
initApp.controller.js我需要访问的功能等initHeaderinitSidebar (定义initApp.js )。
但你可以从我的代码(见initApp.controller.js ), console.log('initController', app); 回报undefined
为了解决这个问题,我定义的函数getAppinitApp.controller.js
但是可以肯定有一个更好的方式来完成这项任务。
任何想法?
谢谢

(*)


** ** main.js

define([
    'js/app',
    'js/init/initApp',
//    'js/tasks/tasksApp'
],
function (App)
{
    "use strict";
    App.initialize();
});

** ** initApp.js

/*global define*/
define([
    'backbone',
    'js/app',
    'js/init/initApp.routing',
    'js/init/views/sidebarView',
    'js/init/views/headerView',
],
function (Backbone, App, Router, SidebarView, HeaderView)
{
    "use strict";
    console.log('initApp', Router)
    var initApp = new Backbone.Marionette.Application({

        initHeader: function ()
        {
            var headerView = new HeaderView();
            App.header.show(headerView);
        },

        initSidebar: function ()
        {
            var sidebarView = new SidebarView();
            App.sidebar.show(sidebarView);
        }

    });

    return initApp;
});

** initApp.routin,JS **

/*global define*/
define([
    'backbone',
    'marionette',
    'js/init/initApp.controller'
],
function(Backbone, Marionette, controller)
{
    "use strict";
    console.log('initRouting', controller)
    var Router = Backbone.Marionette.AppRouter.extend({

        appRoutes: {
            '*defaults': 'index'
        }

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

});

** ** initApp.controller.js

/*global define*/
define([
    'js/init/initApp'
],
function(app)
{
    "use strict";
    console.log('initController', app); // undefined
    var getApp = function () {
        var initApp;
        require(['js/init/initApp'], function (app) {
            initApp = app;
        });
        return initApp;
    };

    var controller = {
        index: function ()
        {
            var app = getApp();
            app.initHeader();
            app.initSidebar();
        }
    }

    return controller;

});

Answer 1:

不知道这是否是实现的事情以正确的方式,但是,你的情况,如果您加载顺序将是工作的模块。

1) initApp
2) initController
3) initRouting

因此,这意味着你的main.js应该是:

define([
    'js/app',
    'js/init/initApp.routing'
],
function (App)
{
    "use strict";
    App.initialize();
});


Answer 2:

你在你的文件循环依赖: initApp -> initApp.routing -> initApp.controller -> initApp 。 这就是为什么你得到undefined

在声明时,当你定义类/对象,该命令只有在有你的代码的依赖很重要。 就我而言,我初始化的initApp.js路由器和控制器,所以我有:

initApp.js

define(['backbone', 'js/init/initController', 'js/init/initApp.initRouting', ...],
function(Backbone, controller, Router, ...) {
  return {
    initialize: function() {
      // Store a namespaced global reference to my app.
      window.MyApp = new Backbone.Marionette.Application();
      MyApp.addRegions({...});
      MyApp.addInitializers(function(options) {
        MyApp.router =  new Router({controller: controller});
        // Other init stuff...
      });
      MyApp.start();
    }
  };
});

自从我保存到我的window.MyApp应用的参考,它无需任何额外的逻辑在我的JS文件现在访问。 例如,我可以直接从控制器或任何视图访问区域:

MyApp.myRegion.show(someView);

所以我main.js是很小的:

require(['app', 'backbone', 'json2'], function(app){
  window.console = window.console || {log: function() {}}; // Needed for IE.
  app.initialize();
});

无论是我的路由器或控制器JS文件互相依赖或在App文件。

initApp.Routing.js

define([
  'jquery',
  'underscore',
  'backbone'
  ], function($, _, Backbone) {
  var Router = Backbone.Marionette.AppRouter.extend({
    appRoutes: {
      // My routes go here...
    }
  });
  return Router;
});

也就是说,我初始化我的路由器在应用程序,从而降低了JS文件之间的依赖关系。

同样,我的控制器只有向下对各种意见和集合的依赖:

initApp.Routing.js

define([
  'jquery',
  'underscore',
  'backbone',
  'myview',
  'mycollection'
  ], function($, _, Backbone, View, Collection) {
  var controller = {
    showMyView: function() {
      // ...
    }
  });
  return controller;
});

什么我花了一段时间来换我的头周围是申报和执行之间的区别。 只要你只申报的东西(即物体包裹,或致电延长)在您的JS文件,我通过你的main.js'的单一入口点执行app.initialize()你会是安全的,您可以访问MyApp任何地方对象。

更新

对于另一种方法取得进入你的应用程序实例在其他JS文件,看到更新的Backbone.Marionette维基访问你的应用程序实例来自其他模块 。



文章来源: How to define controller, router and app in the right order using requireJs