【问题标题】:how do I set up client-side AJAX polling如何设置客户端 AJAX 轮询
【发布时间】:2011-12-30 15:21:37
【问题描述】:

我一直在努力,直到它变软为止。是时候咨询专家了!

我的应用产生了许多 Delayed::Jobs。我想在用户运行时为用户提供有关这些作业状态的视觉反馈。所以假设我有一个 Job

还假设一个带有<div id='job-status'></div> 元素的视图模板作为显示作业状态的位置。哦,还假设我正在使用带有 jQ​​uery 的 Rails3。

为了获得最大的可移植性,我想使用 javascript 发起的客户端轮询。我知道一点 javascript(jQuery 方法、setTimeout 等),但我还没有发现 Rails 和 jQuery 函数的混合可以以一种明智的方式做到这一点。

简而言之,如果您有一个带有名称、状态和状态的 ActiveRecord 作业模型,您会在 controllers/jobs_controller.rb 中放入什么以及将实现哪些视图/jobs/?服务器是否生成 html 或 JSON 或 XML 来更新#job-status div? (我意识到这是一组广泛的问题——我并不期待一个完整的答案,只要有足够的指针来拼凑它。)

谢谢。

【问题讨论】:

    标签: jquery ajax ruby-on-rails-3 json


    【解决方案1】:

    您应该通过 jquery 对控制器上启用 json 的方法进行 ajax 调用,该方法会发回数据。

    使用该数据,您可以通过 $("#somediv").html(ajax_result) 等方法更新 div 元素的内容

    这是一个真实的示例:

    var linkHtml = $("#searchNumber").html();
    $("#message").empty();
    var aurl = "/Prospect/SearchNumberAuth?number=" + $("#MSISDN").val() ;
    $.ajax({
        dataType: 'json',
        type: "GET",
        url: aurl,
        async: false,
        contentType: "application/json; charset=utf-8",
        beforeSend: function() {
            $("#holdNumber").fadeOut("slow");
            $("#searchNumber").empty().html("<image src='../../Content/images/jquery-ui/load-indicator.gif'/>");
        },
        success: function(response) {
            $("#message").fadeIn(1500).html(function() {
                if (response[0] == "Exist") {
                    $("#holdNumber").fadeIn("slow");
                    $("#MSISDN").attr("readonly", "readonly");
                    $("#searchNumber").fadeOut("slow");
                    return existMsg;
                } else if (response[0] == "Sold") {
                    $("#searchNumber").empty().html(linkHtml).fadeIn("slow");
                    return soldMsg;
                } else if (response[0] == "Hold") {
                    $("#searchNumber").empty().html(linkHtml).fadeIn("slow");
                    return holdMsg;
                } else
                    $("#searchNumber").empty().html(linkHtml).fadeIn("slow");
                return notExistsMsg;
            });
        },
        error: function(jqXHR, textStatus, errorThrown) {
            $("#searchNumber").empty().html(linkHtml).fadeIn("slow");
        },
        complete: function() {
        }
    });
    

    这是控制器类中的服务器端代码,可以轻松移植到 Rails:

        public JsonResult SearchNumberAuth(long number)
        {
            return this._searchNumber(number);
        }
    

    _searchNumebr 方法中,我将返回JsonResult

    您可以在website 中看到更多详细信息,虽然它是波斯语,但您可以在 ProspectView.js 中看到 FireBug 的 js 代码,并在第二个选项卡中看到结果。

    【讨论】:

    • Jani:+1 用于解决我三分之一的问题:使用 JSON 作为服务器 => 客户端响应。感谢那。但我坚持的其他部分是(a)如何在 Rails 控制器或视图中构造 JSON,以及(b)如何启动和停止定期轮询。
    猜你喜欢
    • 2011-11-12
    • 2012-12-10
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 2013-01-31
    • 2011-01-20
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多