如何绑定到表单的 ajax:使用 JQuery/Rails UJS 在 typescript 中取得成功

Posted

技术标签:

【中文标题】如何绑定到表单的 ajax:使用 JQuery/Rails UJS 在 typescript 中取得成功【英文标题】:How to bind to a form's ajax:success in typescript with JQuery/Rails UJS 【发布时间】:2021-06-30 15:00:42 【问题描述】:

我正在使用 Rails 6、webpacker 和 ts-loader。我安装了@types/jquery。我有这个代码。

interface PDFSave 
  url: string;


interface AjaxSuccessEvent 
  detail: [PDFSave, any, any];


$(() => 
  const setup = ($container: JQuery<htmlElement>) => 
    $container
    .on('ajax:success', (e: AjaxSuccessEvent) => 
      const [data] = e.detail;
      // here I want to use the PDFSave data...
    )
  ;

  const $container = $('form.pdf-save-form');
  setup($container);
);

打字稿是这样说的:

[tsl] /Users/(me)/work/(rails app 文件夹)/app/javascript/(相关文件).ts(12,9) 中的错误 TS2769:没有重载匹配此调用。 最后一个重载给出了以下错误。 'string' 类型的参数不能分配给 'TypeEventHandlers void, HTMLElement, HTMLElement>' 类型的参数。

我知道 Rails UJS 在事件的 detail 属性中返回 ajax 调用的解析 json 作为 3 元组的第一个元素。我正在从服务器端的 ajax 调用返回 url: "http://some/place" 的 json。

我的问题是如何优雅地让这个概念与 Typescript 一起传递,而不会出现编译器错误。

【问题讨论】:

【参考方案1】:

我能够更改事件类型以适应 jquery on(...) 重载之一,然后向下转换以符合我的特殊事件类型。也必须扩展 JQueryEventObject。

interface PDFSave 
  url: string;


interface AjaxSuccessEvent extends JQueryEventObject 
  detail: [PDFSave, any, any];


$(() => 
  const setup = ($container: JQuery<HTMLElement>) => 
    $container
    .on('ajax:success', (e: JQueryEventObject) => 
      const [data] = (e as AjaxSuccessEvent).detail;
      // can use PDFSave data...
    )
  ;

  const $container = $('form.pdf-save-form');
  setup($container);
);

【讨论】:

以上是关于如何绑定到表单的 ajax:使用 JQuery/Rails UJS 在 typescript 中取得成功的主要内容,如果未能解决你的问题,请参考以下文章

无法绑定 ajax:success 到使用 form_for 创建的表单 .... :remote => true

jQuery插件:Ajax将Json数据自动绑定到Form表单

ajax html响应中的AngularJs数据绑定

AJAX部分加载后的Vue绑定?

ASP.NET使用AJAX完成前后端表单数据交互(包含Vue绑定下拉选项)

用于选择的 KendoUI Grid Ajax 绑定参数