【问题标题】:populating menus from multiple collections从多个集合中填充菜单
【发布时间】: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”?
  • 我不太明白。 /modules path 返回一个模块列表,这些模块被输入到集合中并作为模型传递给视图。因此,首先,如果您使用的是集合,则将其作为集合传递给视图。其次,您是否期望使用该路径的 ID,例如 /modules/id?它是否返回一个项目而不是一个列表?
  • @iMoses,是的 /modules 返回一个模块列表,然后 ModulesView.html 加载该列表。如果存在 id,则 ModulesListItemView.html 加载单个项目而不是列表。
  • 您是否希望获取多个模块列表?您收到的初始数据有什么问题?

标签: node.js mongodb backbone.js express socket.io


【解决方案1】:

不完全确定您的代码是如何工作的,但这里有一些主干提示。

如果您想从集合构建菜单,请不要将集合作为模型传递。

代替:

    $("#content").html(new ModuleListView({model: moduleList, page: p}).el);

用途:

    $("#content").empty().append(new ModuleListView({collection: moduleList, page: p}).el);

代替:

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;
}

用途:

render: function () {
    this.$el.html('<ul class="thumbnails">');

    this.collection.each(function(model) {
        this.$('.thumbnails').append(new ModuleListItemView({model: model}).render().el);
    }, this);

    return this;
}

如果您不需要更新或删除模型,只需将 url 路径 /modules 添加到集合中,以读取初始模块。

【讨论】:

  • 我添加了新代码,应用仍然可以运行,所以这是一个开始。
  • 我添加了新代码,应用仍然可以运行,所以这是一个开始。如果我想在 ModuleListItemView 加载时访问第二个集合,以填充不相关数据的菜单,例如,与该集合不相关......我是否需要为每个数据库调用创建一个新模型和新视图?我仍然认为我的问题是 server.js 文件中的 app.get 函数 - 似乎我只能为每个 URL 路径/模块发送一个集合。如果我添加 /modules/:id,我会加载第二个视图,作为第二个 URL 路径。但我想将多个集合发送到单个 URL 路径。
  • 啊哈!它在 main.js - 我添加了另一个 $("#content").empty().append(new ModuleListView({collection: moduleList, page: p}).el);修复了 URLS,它起作用了。谢谢!!!
猜你喜欢
  • 2019-05-26
  • 1970-01-01
  • 2017-10-01
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多