【问题标题】:How to remove the "name" param in for fields in ExtJS 4如何删除 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:你为什么不赞成我的问题?显然,有几个人都明白我在问什么。

标签: javascript extjs extjs4 extjs4.1 extjs4.2


【解决方案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 起可用

【讨论】:

    猜你喜欢
    • 2011-09-17
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多