【问题标题】:How does AJAX work without reloading the page?AJAX 如何在不重新加载页面的情况下工作?
【发布时间】:2017-11-20 14:55:59
【问题描述】:

我有一个按钮的代码(不是我写的),它可以为某人添加书签并将其添加到候选名单中。它看起来像这样:

JS & Ajax 部分:

self.isShortlisted = ko.observable(@(Model.Application.IsShortlisted ? "true" : "false" ));

self.isHidden = ko.observable(@(Model.Application.IsHidden ? "true" : "false" ));

$('form#shortlistForm').ajaxForm(function () {
    viewModel.applicationViewModel.isShortlisted(true);
});

$('form#unshortlistForm').ajaxForm(function () {
    viewModel.applicationViewModel.isShortlisted(false);
});

【问题讨论】:

  • 请不要就同一个问题问那么多问题。只问一个问题并对其进行编辑以更改其内容。 :-)
  • 你能发布视图模型viewModelapplicationViewModel吗?
  • 如果 applicationViewModel 在你的 ViewModel 中是一个 observable,那么你应该在你的 Ajax 函数中写 viewModel.applicationViewModel().isShortlisted(true);。也就是将()添加到applicationViewModel
  • 抱歉重复的问题。我添加了“需要”重新加载以查看更改的页面的脚本部分。请帮助
  • 这句话self.applications = ko.observableArray(@Html.Json(Model.ApplicationCompatibilities.Select(o => o.JsonForm)) || []);定义了一个可观察的数组,但是它的内容是不可观察的。当您更改属性isShortListed 时,什么也没有发生,因为它不是可观察的。您可以使用映射插件 (knockoutjs.com/documentation/plugins-mapping.html) 强制其内容可观察,但随后您必须更改所有视图模型。

标签: javascript jquery html ajax knockout.js


【解决方案1】:

AJAX 代表“异步 JavaScript 和 XML”,正如您所指出的,它用于执行任务而无需重新加载页面。

是什么让 ajax 在不重新加载页面的情况下工作?

在回答您的问题时,“异步”任务可以与其他任务一起执行,无需等待其他任务完成(同步)。因此,您无需重新加载/刷新页面即可显示新信息,因为它是同时执行的。

AJAX 使用 xhttp 请求通常从 Web 服务器返回 JSON 对象。您可以操作 DOM、JavaScript 或 HTML 来向用户显示对象。

You can read more about AJAX here

希望这能有所帮助

【讨论】:

  • 谢谢。你对我的附加问题有什么想法吗?
【解决方案2】:

您正在将 jQuery 与 Knockout 混合使用。提交由 jQuery 处理。 如果你使用 Knockout,让它来处理提交事件添加到 <form> 这个submit: submitShortlistForm,:

<form id="shortlistForm" data-bind="submit: submitShortlistForm, style: { display: application.isShortlisted === false ? 'inline-block' : 'none'}, attr: {action: '@(MVC.GetLocalUrl(MVC.HireOrgJobApplication.ViewApplication(Model.CurrentOrganization.CustomUrl, Model.Job.JobKey, "xxx/ajax-shortlist")))'.replace('xxx', application.applicationKey)}" method="post" style="display:inline;">
    @Html.AntiForgeryToken()
    <input type="hidden" name="ApplicationKey" data-bind="attr:{ value : application.applicationKey }" />
    <button type="submit" class="btn-act jui-tooltip" title="Shortlist">
        <i class="fa fa-2x fa-star"></i>
    </button>
</form>                 

然后,在您的视图模型中添加:

self.submitShortlistForm = function(){
    // I think is better to use $.post() or $.ajax().
    // I use the pluging because is in your question.
    $('form#shortlistForm').ajaxForm(function () {
        // Allways change position [0] of the observable array
        self.applications()[0].isShortlisted = true;

        var data = self.applications().slice(0);
        self.applications([]);
        self.applications(data);
    });
    $(this).ajaxSubmit();
}

在 Knockout 提交事件中,我将表单与 ajaxForm 插件绑定,然后提交。我不确定 jQuery 插件,我会使用 $.post()$.ajax()

您可以在此链接The "submit" binding 中找到有关 Knockout 提交的更多信息。

我不喜欢这个解决方案,因为您要删除 self.applications 可观察数组的所有内容。最好使用mapping plugin 并将所有application 对象(及其内容)转换为可观察对象。但是使用这种方法,您应该修改您的 ViewModel 和视图。

更新 1 (19/06/2017)

如果这个&lt;form&gt;foreach 循环内,那么self.submitShortlistForm 可能是这样的:

self.submitShortlistForm = function(application){
    $('form#shortlistForm').ajaxForm(function () {
        // Updates the current row element.
        application.isShortlisted = true;

        var data = self.applications().slice(0);
        self.applications([]);
        self.applications(data);
    });
    $(this).ajaxSubmit();
}

还有html:

<form id="shortlistForm" data-bind="submit: $root.submitShortlistForm, ...">

希望这会有所帮助。

【讨论】:

  • 非常感谢先生。但是当我将它添加到我的 viewModel 时,它给了我一条消息说“未捕获的 ReferenceError:无法处理绑定”foreach:函数(){返回过滤的应用程序}“消息:无法处理绑定“提交:函数(){返回 submitShortlistForm} “消息:submitShortlistForm 未定义”//我假设发生这种情况是因为此表单位于淘汰赛 foreach 循环中。这个错误有解决办法吗?
  • @user7677413 我更新了我的答案,希望这会有所帮助。如果您不断收到此错误,请尝试将 self.submitShortlistForm 的正文留空,以丢弃任何语法错误。在这个小提琴(jsfiddle.net/L39h30je/2)中,您有一个正在运行的示例;它显示了三个项目;如果你点击每一个,它就会改变。
  • 谢谢。我不再收到错误消息。但是根据我的 HTML 表单的情况,{ display: application.isShortlisted === false },当我单击表单时它是否应该消失,因为它会将“isShorlisted”更改为 true?我还尝试使用控制台将 isShortlisted 更改为 true,但它没有对按钮进行任何更改。
  • 您可以在self.submitShortlistForm 函数中放置一个断点以查看self.applications() 会发生什么。如果这不起作用,您唯一的解决方案是使用映射插件 (knockoutjs.com/documentation/plugins-mapping.html) 使 isShortlisted 成为可观察对象,并更改所有模型和视图。
【解决方案3】:

Ajax 是一种客户端脚本,无需回发或完整页面即可与服务器/数据库进行通信刷新。
Ajax 的最佳定义是 这种 Ajax 方法用于与服务器交换数据,它只更新网页的一部分

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 2012-02-23
  • 1970-01-01
  • 2013-08-20
  • 2011-10-22
  • 2021-07-17
相关资源
最近更新 更多