适用于非SPA的JavaScript体系结构

时间:2013-02-19 15:55:21

标签: javascript backbone.js knockout.js frontend

我想知道使用Backbone.js(或其他MV * JS框架)的最佳方法是什么,而无需将整个应用程序重写为单页应用程序。我只是想用JS和我的API处理我的CRUD操作,但保留旧的导航链接。

如果用户导航到/场地,他可以在不离开页面的情况下进行与场地相关的CRUD。

我想这就像拥有很多SPA。

我如何模块化Backbone(或任何其他JS框架),以便我只能在每个页面上触发我需要的模块。

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:2)

我在很多不同的情况下使用这样的骨干。我结束了:

  • 忽略路由器
  • 视图和模块只是JS字典,内置一些有用的方法
  • 收藏品增强阵列

之后,只需写一些javascript!

答案 1 :(得分:1)

我使用的方法类似于@dormisher。

选项1

使用模型,视图等的占位符对象创建MyApplication对象:

var MyApplication = {
  Models: {},
  Views: {},
  Collections: {},
  Routers: {},
  initFirstApp: function() {
    new MyApplication.Routers.FirstRouter();
    Backbone.history.start();
  },
  initSecondApp: function() {
    // similar to above...
  }
};

通过扩展MyApplication对象来定义模型,视图等:

var MyApplication.Routers.FirstRouter = Backbone.Router.extend({ ... });

然后,假设您有一个仅在您希望FirstApp运行时加载的js文件,只需致电MyApplication.initFirstApp()

(当然,您也可以按应用程序组织Backbone构造,如@dormisher的代码示例所示,并为每个构建一个initstart方法。)

选项2

另一种选择是拥有一个可以在每个Backbone驱动的页面上实例化的公共路由器,如果当前url与定义的路由匹配,Backbone将自动接管。如果每个页面只有一条路线(即每个应用程序都是SPA且没有子路径),我建议您只使用这种方法。

答案 2 :(得分:0)

我在一些应用程序中使用过这种方法,我现在正在重写站点的一部分,并为站点的每个主导航部分创建了许多小型骨干应用程序。

看起来很明显,但我所做的只是每个部分都有一个脚本文件。因此,对于网站的用户部分,我简单地有一个名为users.js的js文件,其中包含我们用于本节的所有视图/模型/路由器等。任何像基本视图一样共享的内容,或者包含在users.js文件中的共享js文件中的任何内容。这样,所有内容都保存在一起并且很容易找到,并且您只能在页面加载时向服务器发出一些请求。

为了改善组织,我还将所有内容存储在类似命名空间的JSON对象中,因此我创建了一个全局JSON对象,如下所示:

var MyApplication = {
  Users: {
    Views: {}, // all backbone views go in here
    Models: {} // all models go here
    // routers etc
  }
}

很简单,但你知道旧的axim:Keep It Simple Stupid!