【问题标题】:Backbone with dynamic views具有动态视图的主干
【发布时间】:2012-08-09 08:47:36
【问题描述】:

我正在尝试在骨干 js 中实现这样的目标

var AppRouter = Backbone.Router.extend({
    routes: {
        // MVC like route
        ':controller': 'defaultRoute',
        // MVC like route
        ':controller/:action': 'defaultRoute',
        // MVC like route
        ':controller/:action/:id': 'defaultRoute',
        // MVC like route
        ':controller/:action/*id': 'defaultRoute'
    },
    defaultRoute: function (controller, action, id) {
        // render view here or 
        // call another specific route regarding to controller parameter
    }
});

var appRouter = new AppRouter;
Backbone.history.start();

所以当 url 为:something.com/#home/index defaultRoute 函数会获取参数 controller="home"action="index"。 我现在想知道如何在文件夹“controller/home/index”中找到视图(Backbone.View)并动态实例化(和渲染)。还想知道是否更好的方法是为每个“控制器”使用 Backbone.Router(我使用名称“控制器”,但它实际上是“路由器”)。

有什么想法吗?

更新可能的解决方案!

我最终得到了这个

    // Filename: router.js
define([
  'jquery',
  'underscore',
  'backbone'
], function ($, _, Backbone) {
    var AppRouter = Backbone.Router.extend({
        routes: {
            // MVC like route
            ':controller': 'defaultRoute',
            // MVC like route
            ':controller/:action': 'defaultRoute',
            // MVC like route
            ':controller/:action/:id': 'defaultRoute',
            // MVC like route
            ':controller/:action/*id': 'defaultRoute'
        },
        defaultRoute: function (controllerName, actionName, id) {
            controllerName = controllerName || Config.Defaults.Controller;
            actionName = actionName || Config.Defaults.Action;
            require(["controllers/" + controllerName], function (ctl) {
                var code = "ctl." + actionName + "();";
                eval(code);
            });
        }
    });

     var appRouter = new AppRouter;
        Backbone.history.start();
});

示例控制器是这个

define([
  'jquery',
  'underscore',
  'backbone'
], function ($, _, Backbone) {
    return {
        index: function () {
            console.log("Action: Index");
        },
        about: function () {
            console.log("Action: About");
        }
    };
});

它适用于这个示例。现在正在尝试解决参数绑定等问题。需要更多测试。

【问题讨论】:

  • 干得好,现在是 2015 年,我会窃取你的想法 :)

标签: backbone.js backbone-views


【解决方案1】:

目前我仍在调查,但这是我目前正在使用的代码:

    // Filename: router.js
define([
  'jquery',
  'underscore',
  'backbone'
], function ($, _, Backbone) {
    var AppRouter = Backbone.Router.extend({
        routes: {
            // MVC like route
            ':controller': 'defaultRoute',
            // MVC like route
            ':controller/:action': 'defaultRoute',
            // MVC like route
            ':controller/:action/:id': 'defaultRoute',
            // MVC like route
            ':controller/:action/*id': 'defaultRoute'
        },
        defaultRoute: function (controllerName, actionName, id) {
            controllerName = controllerName || Config.Defaults.Controller;
            actionName = actionName || Config.Defaults.Action;
            require(["controllers/" + controllerName], function (ctl) {
                var code = "ctl." + actionName + "();";
                eval(code);
            });
        }
    });

     var appRouter = new AppRouter;
        Backbone.history.start();
});

所以“控制器”看起来像

    // Filename: controllers/home.js
define([
      'jquery',
      'underscore',
      'backbone',
    ], function ($, _, Backbone) {
        return {
            index: function () {
                require(['views/home/index'], function (view) {
                    view.render();
                });
            },
            about: function () {
                require(['views/home/about'], function (view) {
                    view.render();
                });
            }
        };
    });

接下来是创建典型的主干views

我会在测试传递参数并做一些更复杂的测试时发布更多内容。

【讨论】:

  • 一个问题,但是:如何使用 requirejs 要求整个目录(控制器)?您肯定不想在配置文件中单独定义每个文件的路径吗?还是没有办法解决这个问题?基本上,我正在寻找一种方法以递归方式将 requirejs 与整个文件夹一起使用。
【解决方案2】:

JS客户端动态依赖加载,我想这还是我们的梦想。

您可以使用像Dynamic Script Loading 这样非常棘手的技术,但即使一开始看起来很容易,它也会变成一场噩梦(迟早)。

如果您需要这样的技术,请确保它值得,您应该重新考虑一下。

关于是否将一个路由器用于整个应用程序,或者通过控制器/模块或我已经拥有的任何东西将其分隔在多个路由器中said my opinion about

【讨论】:

  • 难道 requirejs 库不能解决动态加载问题吗?
  • @AndrejKaurin 我从来没有使用过 RequireJS 但我认为它只提供了一个在 page load 而不是 上加载脚本的系统按需.
  • RequireJS 提供了按需加载脚本的系统。刚刚对需求案例进行了深入测试。
  • @AndrejKaurin 很高兴知道,您应该为自己的问题添加一个答案,以便其他人可以从中学习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多