繁体   English   中英

如何在javascript回调中访问更新的对象(而不是旧对象)

How to access the updated object in a javascript callback (instead of the old object)

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

这里介绍的有用且有效的解决方案的基础上,我也试图修复更新回调。

问题是,即使此回调是由成功的update操作触发的,我尝试从中提取数据的特定unit始终是旧的缓存版本。

// callback triggered by the update action

$('.best_in_place').bind("ajax:success", function () {
   ...
    console.log(unit.duration);
    // which is exactly the same as
    console.log(<%= Unit.find(unit.id).unit_users.pluck(:duration).sum %>);
    // and both print the OLD duration val instead of the updated val which is in the database
});

和unit_users_controller代码...

  def update
    @unit = @unituser.unit

    respond_to do |format|
      if @unituser.update(unit_user_params)
        @unit.reload
        logger.info('-----------------------------------------------------------------')
        logger.info('@unit.duration in the controller is ' + @unit.duration.to_s) # which is the correct value
        logger.info('-----------------------------------------------------------------')
        gon.unit_duration = @unit.duration # an experiment which didn't work for me
        format.json {respond_with_bip(@unituser) }
      else
        # format.html { render :action => 'edit' }
        format.json { respond_with_bip(@unituser) }
      end
    end
  end

我已经尝试了几个版本的unit.reload ,但没有任何帮助。 也许我把它放错了地方?

2 个回复

这与缓存无关。 在将JavaScript发送到客户端之前,您的Ruby代码在服务器端进行了评估,并且仅在AJAX请求发生之前就进行了一次评估。

客户永远不会看到这一行:

console.log(<%= Unit.find(unit.id).unit_users.pluck(:duration).sum %>);

客户将看到的所有内容如下:

console.log(32); // or whatever the sum is

您不能在此处使用<%= %> 这将始终为您提供原始价值。 相反,您需要将新值发送到客户端以响应AJAX请求。

我前段时间做过的这是我的代码,也许它将对您有所帮助:

Javascript:

$(document).ready(function() {
  $('.price_bind').bind("ajax:success", function (event, data, status, xhr) {
      var parsed_data = jQuery.parseJSON(data);
      $(this).text(parsed_data.newprice);
      $(this).parentsUntil('body').find(".totalpricep span").text(parsed_data.totalprice);
  });
}

视图:

<%= best_in_place detail, :price, :classes => 'price_bind', :path => purchase_detail_path(@purchase, detail)%>

控制器:

 def update
    respond_to do |format|
      if @detail.update_attributes(params[:detail])
        @n=@detail.mk_bal
        @r=false
        if @detail.purchase != nil
          @p=@detail.purchase.totalprice
        if params[:detail]['status'] && @purchase.step==1
          @remdet = @purchase.details.where(:step => 1, :status => false)
          if @remdet.empty?
            @purchase.update_attribute(:step, 2)
            @r=true
          end  
        end
        else
          @p=nil
        end
        format.html { redirect_to @detail, notice: 'Detail was successfully updated.' }
        format.json { render :json => {:newprice => @n, :totalprice => @p, :newstatus => @detail.status, :refresh => @r}}
      else
        format.html { render action: "edit" }
        format.json { render json: @detail.errors, status: :unprocessable_entity }
      end
    end
  end
1 对象中的JavaScript回调

我正在编写一个Javascript应用程序,该应用程序通过AJAX获取HTML文档,然后需要对其进行处理以将事件侦听器(特别是Bootstrap弹出窗口)附加到其中的元素。 我在连接收听者时遇到困难,我认为这是一个范围问题。 以下是相关代码: 问题(我认为)是this.load的fu ...

2 如何在JavaScript中的对象中访问对象

嗨,我有一个“人”对象,其中包含四个“人”对象 反过来,每个这些“人”对象都包含键和值。 如何在Javascript中访问这些值? 例如,尝试访问其“名称”字段无效: 我是JS新手。 谢谢! ...

8 如何在对象javascript中访问对象

我有一个对象的初始状态,如下所示: 我有一个setUserAnswer函数,如下所示: 我正在使用$ apply使用react-addons-update更新值,并且此setUserAnswer函数将基于用户选择设置答案并将该值增加+1 问题是,在用户单击HellYa按钮之 ...

10 旧Javascript中的对象定义

我遇到了以下代码,但感到困惑,无法理解所使用的语法。 我需要帮助来打破一些高调 let HT = HT || {}; //What is this syntax and what does it do ? //Are we adding an Hexagon object to the ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM