我有一个非常基本的HTML表单,我正在使用jQuery的AJAX post功能来获取一些信息,具体取决于数据库插入是成功还是失败。
我的代码目前正在执行以下操作,我只在通过AJAX发布时将ajax
帖子变量设置为true
以区分原点。
app.post("/mypath", function (req, res) {
var post = req.body;
if (post.ajax) {
console.log(post.ajax, "posting as ajax");
}
if (post.ajax) {
res.json({data: "Woah! You posted as ajax."});
}
else {
// If posting via HTML form, send the user where they need to go
res.redirect("someview");
}
});
我真正担心的是,我不希望最终用户以纯文本格式查看带有JSON的页面,但是当我获得JavaScript支持时,我想要一些JSON数据,以便通知用户成功/失败。
有什么方法可以让我更干净吗?我有3个地方需要在一个申请路线中进行条件渲染。
我正在使用Express 3.x
答案 0 :(得分:3)
不确定。只要您的客户端代码正确设置Accept
标头,您就可以使用res.format
,例如:
res.format({
html: function() {
res.redirect('someview');
},
json: function() {
res.json({data: "You expected JSON? You got JSON!"});
}
});
答案 1 :(得分:0)
看看this post我写了一会儿。我写了一个帮助器,它将自动在快递中呈现完整或部分视图。
关键是要创建这样的玉视图:(不幸的是,Jade视图是预编译的,你不能将变量传递给include
,也不能有条件地调用extends
,所以我们需要这个“胶水”文件。你会明白为什么。)
// home_full.jade
extends layout
block content
include home
它扩展了布局文件并包含局部视图。此视图充当真实视图和布局文件之间的粘合剂。这些中间视图总是以“_full.jade”结尾。
接下来,我创建了自己的小中间件函数,将帮助器添加到req
。
app.use(function (req, res, next) {
res.renderView = function (viewName, viewModel) {
res.render(viewName + req.xhr ? null : '_full', viewModel);
next();
};
});
它被称为renderView
,它为我们提供了xhr逻辑。而不是使用req.render
...
res.render('home' + req.xhr ? null : '_full', viewModel);
...您只需致电req.renderView
并传递视图名称:
res.renderView('home');
现在,如果请求是完整页面请求,那么我们将发回完全编译的视图,布局和所有。如果设置了ajax请求标头(大多数客户端库,如JQuery和其他人友好地为您做),那么我们将仅发回部分视图并让客户端填充页面上的相应区域:)
PS - 如果您需要将视图与其他JSON数据一起发回,您可以使用我的扩展版助手功能。例如:
res.renderView = function (viewName, viewModel) {
if (!req.xhr) {
res.render(viewName + '_full', viewModel);
} else {
res.render(viewName, viewModel, function (err, view) {
if (err) return next(err);
res.json({
title: viewModel.title || "Untitled | CodeTunnel.com",
bannerText: viewModel.bannerText || "CodeTunnel.com",
view: view,
url: req.url
});
});
}
};
显然,你会根据自己的需要调整res.json
来电。在上面的实现中,我需要一个JSON对象,其中包含页面标题,要在页面横幅中显示的文本,视图标记作为对象的字符串属性以及请求URL。然后我会在客户端上使用这些数据来渲染局部视图,以及更新页面标题和客户端上的其他内容。