0

我刚刚启动了一个新的 nodejs 应用程序,其中将包含大量用于创建和编辑/更新数据库值的表单。我的问题是:如果给定的数据无效,我该如何重新填充表单条目?

示例:有人尝试登录。如果凭据错误,我将使用以下内容再次显示登录页面:

res.render('sessions/new')

问题是,用户名没有填充请求数据。我想知道如何既简单又干净地做到这一点。由于没有form_for类似的rails,我想我必须手动实现,对吧?我的第一种方法是绕过请求正文/参数作为render函数的本地变量,并在我的翡翠模板中设置值,如下所示:

// In controller/route
res.render('sessions/new', req.body)

// In template
input(type='text', name='username', value=locals.username)

有没有更好或更不显眼的解决方案?我的意思是上面的例子很有效并且很容易实现,只是想知道我是否遗漏了什么。这对于向无效表单字段添加错误类等内容也很有趣。在网上真的找不到任何东西。

提前致谢!

4

2 回答 2

3

我使用连接闪存中间件。通常,此模块用于提供信息性消息(成功、错误等),但它也适用于跨请求持久化表单数据。

POST 表单数据时:

router.post('/create-user', function(res, req, next) {
  // Do stuff
  if (invalid) {
    req.flash('form', req.body);
    res.redirect('/create-user');
  }
});

然后在 GET 方面:

router.get('/create-user', function(res, req, next) {
  // Render the template with form data
  res.render('my_template', {
    form: req.flash('form')[0] || null
  });
});

然后在my_template.hbs(我使用把手):

<form>
  <input type="email" name="email" value="{{form.email}}">
  <input type="name" name="name" value="{{form.name}}">
  ...
</form>

希望有帮助。

于 2015-12-16T11:46:08.217 回答
1

我在客户端使用 jQuery 进行操作。

我使用 express-validator 生成错误映射,其中包含字段名称、原始值和错误消息。

然后我只是在页面底部的布局模板上打印内部脚本标签,然后在 jQuery 中检查它是否为空并循环遍历错误堆栈。将字段标记为错误并显示原始值和错误消息。

这是快速验证器代码:

路线:

  req.assert('username', 'Enter username').notEmpty();
  req.assert('password', 'Enter password').notEmpty();
  res.locals.errors = req.validationErrors(true);
  res.render('/login');

看法:

<p>
 <label>Username</label>
 <input name="username" />
</p>

<script>var errors = <%= errors %>;</script>

客户端javascript(jQuery):

    for ( var e in errors ) {
        var $field = $('[name='+e+']'),
        $el = $field.parents('p');

        $el.addClass('err');
        $el.append('<span class="msg">'+errors[e].msg+'</span>');
    }

另一种方法是在你的视图中做一堆 if/else 和 echo 语句,这会变得非常丑陋,非常快。

于 2012-10-17T18:41:12.180 回答