如何删除 ExtJS 4 中字段的“名称”参数

Posted

技术标签:

【中文标题】如何删除 ExtJS 4 中字段的“名称”参数【英文标题】:How to remove the "name" param in for fields in ExtJS 4 【发布时间】:2013-07-22 17:28:00 【问题描述】:

我正在将支付提供商集成到 ExtJS 网站中。

基本上,需要创建一个表单,然后使用 Ajax 将表单字段发送给支付提供商。

问题在于支付提供商不允许表单字段具有分配给“”标签的“名称”参数。他们对实现进行手动检查,并确保它不存在。

我认为当访问者禁用 Ajax 并且表单被提交到我的服务器时,我认为这是一种反措施,从而显示信用卡。我知道这对 ExtJS 没有任何意义,因为如果没有打开 javascript,它就无法工作,但无论如何,这是支付提供商的规则。

那么,我怎样才能强制 ExtJS 不在表单字段中放置“名称”参数?我尝试将“名称:''”放入字段中,但这被忽略了。

我是否使用 ExtJS 中的模板系统来解决这个问题?

【问题讨论】:

您的问题需要改进,您使用的代码在哪里?它创建的输出是什么?没有代码的问题不适合 SO。 这是一个很奇怪的规则。您可以使用 DOM 查询来查找和操作您的 DOM 元素到您的心脏内容。您可以在渲染后的侦听器中执行此操作。但是ExtJS如何提交没有名字的表单域的数据??? 修改此字段的字段模板以省略 name 属性,但这会使提交无法提交 AFAIK。无论如何,这就是您正在寻找的解决方案。 @sra:是的,我就是这么想的。你有一个示例代码吗? Extjs 无论如何都不会提交表单,所以这一切都很好:) 支付提供商提供的 javascript 正在读取基于 ID 的表单值并进行手动 ajax 调用。无需提交表单。 @JuanMendes:你为什么不赞成我的问题?显然,有几个人都明白我在问什么。 【参考方案1】:

所以 Eric 是完全正确的,它可以比修改整个模板更容易完成,但我会在这种特殊情况下使用插件。我做了一个快速的:

Ext.define('Ext.form.field.plugin.NoNameAttribute', 
    extend: 'Ext.AbstractPlugin',
    alias: 'plugin.nonameattribute',
    init: function(cmp) 
        Ext.Function.interceptAfterCust(cmp, "getSubTplData", function(data)
            delete data['name'];
            return data;
        );
    
);

注意使用的方法interceptAfterCust 是我的一种自定义方法,它通过将原始结果作为参数传递给拦截方法来修改现有方法。它还使用给定的原始对象(可以作为范围受到威胁)作为原始方法的范围。最简单的方法是将这些方法添加到Ext.Function

Ext.Function.interceptAfterCust = function(object, methodName, fn, scope) 
    var method = object[methodName] || Ext.emptyFn;

    return (object[methodName] = function() 
        return fn.call(scope || this, method.apply(object, arguments));
    );

这是一个working JSFiddle,其中第一个字段不会在 dom 上具有 name 属性,即使它存在于组件中。

【讨论】:

不错的解决方案。谢谢:)【参考方案2】:

对此有一个非常简单的解决方案。我用Ext.form.field.TextExt.form.field.ComboBox 对其进行了测试,效果很好,但我不知道它是否适用于所有表单字段,或者是否有任何负面影响。谨慎使用。

Ext.define('Override.form.field.Base', 
    override: 'Ext.form.field.Base',

    getSubTplData: function()
        var data = this.callParent(arguments);
        delete data.name;
        return data;
    
);

基本上,它会在传递之前从渲染数据中删除自动生成的名称。最好的部分是不涉及私有方法,所以这应该是一个稳定的解决方案。

【讨论】:

但这不会覆盖整个应用程序中的所有表单元素吗?我只想在特定的付款表单上执行此操作。有没有办法将其仅应用于特定领域,而不需要制作插件?我尝试将“getSubTplData”直接放在字段上,但没有奏效。【参考方案3】:

我更喜欢在字段配置选项中使用这个:

submitValue: false

自 ExtJS 3.4 起可用

【讨论】:

以上是关于如何删除 ExtJS 4 中字段的“名称”参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在下一个请求中删除 extjs 中的动态参数?

ExtJS 4 - 如何加载带有来自表单的最新值的参数的网格存储?

如何在 Extjs 网格中禁用删除图标

使用行编辑器进行编辑时,如何在 extjs 4.1.1 中禁用行的特定单元格?

ExtJs 4:如何在一个请求中发送所有修改、新和删除的记录?

如何一次通过名称属性为多个元素设置值(ExtJs 4)