我想知道在不将整个应用程序重写为单页应用程序的情况下,使用 Backbone.js(或其他 MV* JS 框架)的最佳方法是什么。我只想用 JS 和我的 API 处理我的 CRUD 操作,但保留我的旧导航链接。
如果用户导航到 /venues,他可以在不离开页面的情况下执行与场所相关的 CRUD。
我想这就像有很多SPA。
我如何模块化 Backbone(或任何其他 JS 框架),以便在每个页面上只触发我需要的模块。
非常感谢你的帮助。
我想知道在不将整个应用程序重写为单页应用程序的情况下,使用 Backbone.js(或其他 MV* JS 框架)的最佳方法是什么。我只想用 JS 和我的 API 处理我的 CRUD 操作,但保留我的旧导航链接。
如果用户导航到 /venues,他可以在不离开页面的情况下执行与场所相关的 CRUD。
我想这就像有很多SPA。
我如何模块化 Backbone(或任何其他 JS 框架),以便在每个页面上只触发我需要的模块。
非常感谢你的帮助。
我在很多不同的情况下都使用这样的骨干。我最终:
之后,只需编写一些javascript!
我使用了类似于@dormisher 的方法。
为您的模型、视图等创建一个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 的代码示例所示,并为每个构造提供init
orstart
方法。)
另一种选择是拥有一个通用路由器,您可以在每个 Backbone 驱动的页面上实例化它,如果当前 url 与定义的路由匹配,Backbone 将自动接管。如果每个页面只有一个路由(即每个应用程序都是一个 SPA 并且没有子路由),我建议您只使用这种方法。
我在一些应用程序中使用了这种方法,目前我正在重写网站的一部分,并为网站的每个主要导航部分创建许多小型骨干应用程序。
这似乎很明显,但我所做的只是每个部分都有一个脚本文件。因此,对于站点的用户部分,我简单地有一个名为 的 js 文件users.js
,其中包含我用于此部分的所有视图/模型/路由器等。共享的任何内容,例如基本视图或与文件一起包含在共享 js 文件中的任何内容users.js
。这样,所有内容都保存在一起并且易于查找,并且您只需在页面加载时向服务器发出几个请求。
为了改进组织,我还将所有内容存储在类似名称空间的 JSON 对象中,因此我创建了一个全局 JSON 对象,如下所示:
var MyApplication = {
Users: {
Views: {}, // all backbone views go in here
Models: {} // all models go here
// routers etc
}
}
真的很简单,但你知道古老的格言:保持简单愚蠢!