0

仍然是一个菜鸟 mariontette.js

我同时使用 Require.js 和 Marionette.js。

我有一个路由器,这是它的基本视图。

define([many, many dependencies],function(many,many names of the dependecies)

{
  return marionette.AppRouter.extend
  routes :{
     bunch of routes : function names
  } 

  function1 : function()
  {
    make a collection/fill collection (collection may be already initialized at top)
    make the views
    show/render the regions with the layouts and views and collections
  }

  .
  .
  .  
}

所以目前,我所有的视图和集合都是我路由器中的依赖项。然后我初始化适当的视图和集合,并在路由被调用时在路由器中显示它们。我希望你能得到图片。起初这对我很有效。但是现在我对这台路由器的依赖列表变得越来越大。每次路由器加载时,它都必须检索每个依赖项的所有模板,这是不必要的。我想解决这个问题,但我不知道如何处理它。

我可能应该做的事情的清单和我有的一些问题:

- 将所有这些方法放在单独的控制器中(哈哈,我目前不使用一个)

- 将其拆分为多个路由器 <-- 在调用特定路由时如何使用正确的路由器。这是否有助于解决我的依赖问题,以便不是同时检索所有模板?

- 我的视图中需要初始化器吗?我没有使用 marionette 模块系统,因为我使用的是 require.js,所以我不确定初始化程序是否可以用于我的单独模块(视图、集合等)。我在路由器函数中创建集合的原因是因为复合视图将集合作为一个选项,因此在创建和显示视图时集合需要在那里。

如果有人对我应该如何改进我的巨型路由器有任何建议,我将不胜感激。

谢谢

4

3 回答 3

1

因此,我进行了更多研究,发现了一些 stackoverflow 问题和答案,这将是我现在要遵循的解决方案。

Backbone.js“胖路由器”设计难题

这里的这个问题与我面临的基本相同。我有一个胖路由器。fencliff 提供的答案看起来不错,因为这是我想做的。他正在拆分路由器并延迟加载每个路由的依赖项。这正是我想做的事情,因为我的路由器从一开始就加载了每个依赖项。

对于 marionette.js,多路由器设置可能如下所示

使用 require.js 的多个路由器和控制器

每个路由器的控制器将保存具有延迟加载 require.js 依赖项的函数。

我并不是说这是一个好的解决方案。如果有人愿意提供,我仍然愿意回答。但现在我会这样做。

于 2013-05-17T03:14:17.900 回答
0

根据我目前的经验,路由器应该只是页面的向前/向后导航。这里有一个很好的 MarionetteJS 入门教程:http ://www.backbonerails.com/ - 你会看到从一个“组件”切换到另一个,可以非常干净地完成应用程序事件,例如描述在这里:https ://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.application.md#appvent-event-aggregator

于 2013-05-16T21:28:20.380 回答
0

我使用路由器执行此操作的方式是不将类作为依赖项加载到模块的定义调用中,而是在触发需要我加载模块的事件时加载。

我的木偶的路由器路由

定义(['木偶','appDispatcher','路由器/路由控制器'],

function(Marionette,
         dispatcher,
         controller){

    var router, routerDefinition;

    routerDefinition = Marionette.AppRouter.extend({
        controller: controller,
        appRoutes: {
            'login': 'showLogin',
            'menu': 'showMenu',
            'inventory': 'showInventory',
            ...
            '*path': 'defaultPathAction'
        }
    });

...

然后我的控制器像这样加载这些模块:

define([], function(){
    controller = {
      showInventory: function(){
        require(['module/path/name'], function(Module){
          currentView = new Module();
          mainView.mainContent.show(currentView);
        });
      },
    ...
    }

这样您的资产就不会预先加载;仅当需要该特定模块时。并且该模块将在执行之前一直加载到依赖链。我认为非常方便。如果没有 Marionette 和路由器控制器,同样的事情也可以完成。只需一个普通的'ol 骨干路由器。

于 2013-07-18T03:39:19.427 回答