为什么 JS 控制器无法正确响应 jquery 调用?

Why does JS controller not respond correctly to jquery calls?

我四处寻找,在这里找不到解决方案。我将 Node 与 Express Handlebars 一起使用,并尝试在导航按钮上使用 jquery。

如果我在浏览器的地址栏中键入地址,routes.js 和控制器文件 item.js 会正常运行。但是,如果我使用 jquery 进行调用,routes.js 会正确地将消息发送到 item.js,但随后什么也没有发生。

这里是代码的相关部分(如果这还不够,可以提供更多):

我的按钮html:

<button class="btn btn-primary btn-lg btn-block" id="btn-item" data-id="{{item.uniqueId}}">Item</button>

我的jquery电话:

$(function(){
    $('#btn-item').on('click', function(event) {
        event.preventDefault();
        var itemId = $(this).data('id');
        console.log("I am itemId = " + itemId);
        $.get('/item/' + itemId).done(function(data) {
        });

    });
});

注意:console.log 消息打印正确。

转到 routes.js 文件:

var item = require('../controllers/item'); //imports item module
router.get('/item/:item_id', item.index);

导入的item.js控制器文件:

var fs = require('fs');
var path = require('path');

module.exports = {
    index: function(req, res) {        
        var viewModel = {
            item: {uniqueId: 1}
        };
        console.log("In item.js!!!!");
        res.render('item', viewModel); //Handlebars file displays correctly
    }
};

在这里,console.log 输出也正确显示。

正如我在顶部提到的,如果我在浏览器地址栏中键入 localhost:3001/item/1,一切都会正确呈现。但是当我尝试使用 jquery 调用它时,我收到了所有控制台消息并且 GET item/1 也出现在节点控制台中,但浏览器没有更新。

有什么线索吗?

问题是您正确获取了内容,但随后丢弃了结果。您需要在挂断 $.get 调用的 done 事件处理程序中做一些事情。

现在在其中放置一个警报并验证它是否被调用。然后您需要替换页面内容或包含元素的内容才能看到结果。

如果您想加载局部视图,可以通过多种方式进行。 假设您的标记中有一个 DIV 占据了页面的一部分(或者可能是页面的大部分。

<div id="sidePanel" class="panels" ></div>

然后假设 url returns 是部分 html 视图(不是完整页面),那么您可以使用 jQuery.

加载它
$(function(){
    $('#btn-item').on('click', function(event) {
        event.preventDefault();
        var itemId = $(this).data('id');
        console.log("I am itemId = " + itemId);
        $.get('/item/' + itemId).done(function(data) {
           $('#sidePanel').html(data);
        });
        //alternate way not using get
        $('#sidePanel').load('/item/' + itemId);
        //Also, here is a neat way to use load
        //note the selector used at the end here. It is optional
        //if provided it will load the result, perform the selector
        //and only load in the content from the selected element
        $('#sidePanel').load('/item/' + itemId +' #panelSource');


    });
});