2013-07-22 41 views
2

我正在將支付提供程序集成到ExtJS網站中。如何刪除ExtJS中的「名稱」參數4

基本上,需要創建表單並使用Ajax將表單字段發送給支付提供商。

問題是,支付提供商不允許表單字段具有分配給「」標籤的「名稱」參數。他們對實施進行手動檢查,並確保它不在那裏。

我認爲這是一個反訪問時訪問者有Ajax dissabled和表單提交到我的服務器,而不是揭示信用卡。我知道這與ExtJS沒有任何意義,因爲如果沒有啓用Javascript,它就無法正常工作,但這是支付提供商的規則。

那麼,我該如何強制ExtJS在表單字段中不放置「名稱」參數?我曾嘗試將「名稱:'''放入字段中,但會被忽略。

我在ExtJS中使用模板系統來解決這個問題嗎?

+0

你的問題需要改進,哪來的代碼,你正在使用?它創建的輸出是什麼?沒有代碼的問題不適合SO。 –

+0

這是一個非常奇怪的規則。您可以使用DOM查詢來查找和操縱您的DOM元素,使其成爲您的心臟內容。你可以在渲染監聽器之後執行它。但是,ExtJS如何用一個沒有名字的表單域提交數據呢? – dbrin

+0

修改此字段的字段模板以省略name屬性,但這會使提交不可能AFAIK。無論如何,這是你正在尋找的解決方案。 – sra

回答

4

因此,埃裏克是完全正確的,它可以做得更容易,然後修改整個模板,但非少我會使用插件這種特殊情況。我做了一個快速:

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屬性,即使它在組件存在。

+0

很好的解決方案。謝謝:) –

+0

@DanieleTesta不客氣;) – sra

0

有一個驚人的簡單的解決方案。我使用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; 
    } 
}); 

基本上,它在傳遞它之前從渲染數據中刪除自動生成的名稱。最好的部分是不涉及私人方法,所以這應該是一個穩定的解決方案。

+0

但是這不會覆蓋整個應用程序中的所有表單元素嗎?我只想在具體的付款表單上進行此操作。有沒有辦法將這個應用到一個特定的領域,而不是插件?我試着把「getSubTplData」直接放在一個字段上,但那沒有奏效。 –

0

我喜歡這個領域的配置選項:

submitValue: false 

可用自ExtJS的3.4