实现搜索功能sailsjs

时间:2013-08-20 08:43:09

标签: javascript node.js sails.js

我正在尝试构建一个简单的搜索功能,但我无法弄清楚为什么我的代码无效。

这是我为搜索而构建的操作:

search: function(req, res) {

    var criteria = req.param('criteria');

    var value = req.param('value');


    Human.find().where({ criteria: value }).done(function(err, humans) {
      if(err) {
        return console.log('Error:' + err);
      }else{
        res.view({
          title: 'Search',
          humans: humans
        });
      }
    });
}

我的主页上有一个带有搜索ID的按钮。我想这样做,以便每当有人点击我的搜索按钮时,它会查询数据库并返回localhost:1337 / model / search的结果。到目前为止,我已经尝试使用两个变量(条件,值)向该控制器操作发送ajax请求,但它不起作用。

这是我提交的ajax电话:

$('#search').on('click', function() {
    var criteria = $('#filter').val();

    var value = $('#value').val();

    $.ajax({
        type: 'POST',
        url: 'http://localhost:1337/human/search',
        cache: false,
        data: {
            criteria: criteria,
            value: value
        },
        success: function(data) {
            console.log('SUCCESS!');
            window.location.href = 'http://localhost:1337/human/search';
        },
        error: function(err) {
            console.log('ERROR!');
        }
    });
});

这是相应的观点:

<table>
    <thead>
        <tr>
    <th>ID</th>
    <th width="150">First Name</th>
    <th width="150">Last Name</th>
    <th width="150">Contact</th>
    <th width="150">E-Mail</th>
    <th>View</th>
    <th>Edit</th>
    </tr>
</thead>

<tbody>
<% _.each(humans, function(model) { %>
<tr>
<td> <%= model.id %> </td>
<td> <%= model.firstName %> </td>
<td> <%= model.lastName %> </td>
<td> <%= model.contact %> </td>
<td> <%= model.email %> </td>
<td><a href="/human/view/<%= model.id %>" class="tiny button">VIEW</a></td>
<td><a href="/human/edit/<%= model.id %>" class="tiny button">EDIT</a></td>
    </tr>
<% }) %>
</tbody>
</table>

1 个答案:

答案 0 :(得分:1)

Promlem#1:当你搜索这样的模型:Human.find().where({ criteria: value })时,你实际上是按名称“条件”搜索,而不是按字段搜索,该名称保存在{ {1}}变量。 尝试创建这样的搜索对象:

criteria

问题#2:为什么要执行ajax请求,然后重定向到同一个网址?
首先,你发出POST请求,虽然GET请求更适合搜索pupposes。当您创建资源时,通常会使用POST 其次,在ajax成功处理程序中,在您使用找到的人体模型接收到视图后,您只需将浏览器重定向到var searchObj = {}; searchObj[criteria] = value; // and then search like you did before Human.find().where(searchObj).done(function(err, humans) { if(err) { console.log('Error:' + err); // you should return some response here: res.send(err, 500); }else{ res.view({ title: 'Search', humans: humans }); } }); url 而不会传递任何参数,因此您的控制器将尝试按空值搜索和标准http://localhost:1337/human/search。所以你不会看到预期的结果。

目前尚不清楚您是想通过ajax获取数据,还是只想在新的HTML页面中显示数据?

编辑:如果您不想使用ajax,请让HTML表单为您完成工作:

Human.find().where({ "": "" })

点击搜索按钮将提交表单并传递GET请求的查询字符串中的所有表单数据: <form action="human/search"> <input name="criteria" value="foo"> <input name="value" value="bar"> <button type="submit" id="search">Search</button> </form>

当然,您可以使用javascript手动构建查询字符串,而无需使用表单,并将浏览器重定向到该URL。结果将是相同的。