【发布时间】:2012-12-07 07:27:12
【问题描述】:
我是新来的backbone.js 和express,我一直在为我自己的项目改编Christophe Coenraets Wine Cellar REST API 示例应用程序。
我正在构建一个表单,该表单需要从 mongodb 中的多个不相关集合中填充多个菜单。
我可以用一个集合填充一个菜单,但我不知道如何将多个集合添加到我的表单视图中。
这是我用来填充一个菜单的文件。如何扩展它以填充两个菜单?
我想我可以为每个要填充的菜单创建一个新视图 - 但这似乎有点过头了。
我可以将两个 mongodb find() 集合合并到一个对象中,并在页面上分别列出它们吗?如果有,怎么做?
提前致谢!
/routes/modules.js 包含:
exports.findAllModules = function(req, res) {
db.collection('modules', function(err, collection) { collection.find().toArray(function(err, items) { res.send(items); }); });};
/server.js 包含:
app.get('/modules', module.findAllModules);
/public/js/main.js 包含:
路线:{
“模块”:“列表”}
...
列表:功能(页面){
var p = page ? parseInt(page, 10) : 1; var moduleList = new ModuleCollection(); moduleList.fetch({success: function(){ console.log('in list function'); $("#content").html(new ModuleListView({model: moduleList, page: p}).el); }}); this.headerView.selectMenuItem('home-menu'); },
...
utils.loadTemplate([
'ModuleListItemView' ], function() { app = new AppRouter(); Backbone.history.start(); });
/public/models/models.js 包含:
window.Module = Backbone.Model.extend({
urlRoot: "/modules", idAttribute: "_id", initialize: function () { this.validators = {}; this.validators.name = function (value) { return value.length > 0 ? {isValid: true} : {isValid: false, message: "You must enter a name"}; }; validateItem: function (key) { return (this.validators[key]) ? this.validators[key](this.get(key)) : {isValid: true}; }, validateAll: function () { var messages = {}; for (var key in this.validators) { if(this.validators.hasOwnProperty(key)) { var check = this.validators[key](this.get(key)); if (check.isValid === false) { messages[key] = check.message; } } } return _.size(messages) > 0 ? {isValid: false, messages: messages} : {isValid: true}; }, defaults: { _id: null, name: "" } });window.ModuleCollection = Backbone.Collection.extend({
model: Module, url: "/modules"});
/public/js/views/modulelist.js 包含:
window.ModuleListView = Backbone.View.extend({
initialize: function () { this.render(); }, render: function () { var modules = this.model.models; $(this.el).html('<ul class="thumbnails"></ul>'); for (var i = 0; i < modules.length; i++) { $('.thumbnails', this.el).append(new ModuleListItemView({model: modules[i]}).render().el); } return this; } });window.ModuleListItemView = Backbone.View.extend({
tagName: "li", initialize: function () { this.model.bind("change", this.render, this); this.model.bind("destroy", this.close, this); }, render: function () { $(this.el).html(this.template(this.model.toJSON())); return this; } });
/public/tpl/ModuleListView.html 包含:
【问题讨论】:
-
您是否考虑过创建一个模型来管理所有集合,将其附加到视图并仅传递所需的数据?
-
感谢@iMoses,这听起来是一个很好的解决方案,但我仍然对架构感到困惑。这就是我认为正在发生的事情: 1. Modules.js 导出数据库调用。 2. server.js 使用 app.get 根据 URL 路径将数据发送到模型 3. 模型使用 this.model.models 访问数据。我已经尝试使用 app.get 两次到相同的 URL 路径,但只有第一次调用会到达模型。所以,我的问题仍然存在 - 我如何将两个集合添加到模型中,一旦它存在我如何访问它?比如“this.model.options.module1”和“this.model.options.module 2”?
-
我不太明白。
/modulespath 返回一个模块列表,这些模块被输入到集合中并作为模型传递给视图。因此,首先,如果您使用的是集合,则将其作为集合传递给视图。其次,您是否期望使用该路径的 ID,例如/modules/id?它是否返回一个项目而不是一个列表? -
@iMoses,是的 /modules 返回一个模块列表,然后 ModulesView.html 加载该列表。如果存在 id,则 ModulesListItemView.html 加载单个项目而不是列表。
-
您是否希望获取多个模块列表?您收到的初始数据有什么问题?
标签: node.js mongodb backbone.js express socket.io