NodeJS:动态表单

时间:2014-04-16 19:12:22

标签: node.js mongodb express mongoose

如何使用NodeJS,Express和Mongoose创建动态表单?

现在我的内容是为了这个问题而硬编码的。

这就是我的页面创建方式:

app.post('/create', function(req, res) {
    var page;
    var b = req.body;

    page = new Page({
        title: b.title,
        url: '/' + Func.stringToUrlSlug(b.title) + '/',
        headline: b.headline,

        contents: [{
                body: b.content1_body,
                class: 'CLASS1'
            },{
                body: b.content2_body,
                class: 'CLASS2'
            },{
                body: b.content3_body,
                class: 'CLASS3'
            }],

        border: b.border,
        target: b.target,
        hidden: b.hidden,
        externUrl: b.externUrl,
        order: 700
    });

    page.save(function(err, page) {
        if (!err)
            res.send(page);
        else
            res.send(err);
    });
});

我的玉石前端创作:

....
div
    label Content
    textarea(name='content1_body')

div
    label Content
    textarea(name='content2_body')

div
    label Content
    textarea(name='content3_body')
....

我的mongoose架构内容属于Array类型。

我的问题是:我如何根据我添加的额外内容字段,使这些文档在我的路线中保持动态?

我是否需要以某种方式在页面数组中推送这些额外的字段?

说某些事情是不清楚的。提前谢谢。

3 个答案:

答案 0 :(得分:1)

如何实现“动态表单”有多种方法。最简单的方法是使用单页应用程序功能,当您在表单之间移动时,根本不加载页面。结果可以存储在document.localStorage中,当用户完成将结果发送到服务器时。

当您不使用客户端可能性时,您必须将每个表单结果存储在临时数据库“table / document”中,您还必须跟踪用户的形式。当用户到达结束时,将之前步骤中的所有数据插入表/文档。

答案 1 :(得分:1)

好了很多尝试后我自己解决了。

我最终以这种方式创建了表单元素:

        div
            label Class
            input(name='content[1][class]')

            label Content
            textarea(name='content[1][body]')

        div
            label Class
            input(name='content[2][class]')

            label Content
            textarea(name='content[2][body]')
....

这样我就能到达内容领域,无论是阶级还是身体领域。我最终将这些推入我的页面数组:

b.content.forEach(function(item) {
    page.contents.push({ class: item.class, body: item.body });
});

我最终用jQuery添加了更多表单字段。

答案 2 :(得分:0)

如果启用Express body-parser

的扩展解析
var app = express();
...
app.use(bodyParser.urlencoded({ extended: true }));

Express将使用qs库。该库具有自动解析功能,可将查询参数转换为数组或对象。

示例(来源:qs docs)

var withIndexes = qs.parse('a[1]=c&a[0]=b');
assert.deepEqual(withIndexes, { a: ['b', 'c'] });

正确解析输入后,将此信息发送给猫鼬是个问题。