2017-08-04 29 views
0

這看起來要回答很多不同的時間,但我似乎無法得到它與我的實施工作。我正在嘗試格式化和限制sap.m.Input元素中的數據。我目前有以下幾種:OpenUI5 sap.m.Input貨幣格式

var ef_Amount = new sap.m.Input({ 
    label: 'Amount', 
    textAlign: sap.ui.core.TextAlign.Right, 
    value: { 
    path: '/amount', 
    type: 'sap.ui.model.type.Currency' 
    } 
}); 

第一個問題是它有種破壞數據綁定的功能。當我檢查提交給服務器的原始數據(使用Fiddler)它是一個這樣的數組:

"amount": [1234.25,null] 

服務器期望的單個數字,因此具有與陣列的問題。

當我使用以下內容時,該綁定按需要工作,但不執行格式化。

var ef_Amount = new sap.m.Input({ 
    label: 'Amount', 
    textAlign: sap.ui.core.TextAlign.Right, 
    value: '{/amount}' 
}); 

第二個問題是輸入的數據不限於數字。

我嘗試過使用sap.m.MaskedInput來代替,但我不喜歡佔位符的用法,因爲我永遠不知道要輸入的數字的大小。

最後,如果將焦點放在輸入字段上時,所有格式將被移除並在焦點丟失時再次重新格式化,那將會很不錯。

我應該考慮用jQuery甚至原始Javascript來做這件事嗎?

謝謝你的期待。

+0

與sapui5吸引更多用戶的標籤。標籤sapui5涵蓋sapui5和openui5 – n01dea

回答

0
  1. 陣列輸出是根據文檔正常的一個。因此,您需要教您的服務器在提交之前對這種格式進行處理或預處理數據;
  2. 類型不打算限制您的數據輸入;
  3. 很好的功能,但ui5不支持這個,因爲Type對象不知道控制,它的事件像「焦點」它只處理數據輸入輸出。所以你必須通過擴展控件或其他東西來自己實現這個功能。

我會建議分別使用金額和貨幣。應該只允許用戶輸入有效貨幣,因此您可以使用帶有可用貨幣建議的組合框。

+0

好吧,基於這些信息,它看起來像擴展控件是我的最佳選擇,以限制數據輸入到貨幣,以及找到一種方法來格式化/聚焦增益數據格式/ 失利。 – Terry

+0

我可以想象下面的解決方案: 1.您在「輸入」控件上處理「focusin」和「focuseout」事件; 2.當用戶關注時,您將控件重新綁定到相同的路徑,但不使用數據類型(它會以原始格式轉換值) 3.當用戶關注時,您將控件綁定到相同的路徑,但WITH使用數據類型(數據填充格式爲數據返回) 4.您可以通過使用輸入的「liveChange」事件來防止用戶輸入垃圾(使用裏面的正則表達式替換錯誤的字符) –

+0

綁定的數據項目在重新綁定「值」屬性之前似乎沒有更新。我最終顯示並格式化了舊數據。這不會發生像'後焦點'事件?以這種方式數據模型首先被更新。 – Terry

0

因此,在@Andrii的大量工作和協助之後,我設法讓它工作。主要問題是破壞了模型的更新,而更改了事件。只需更換onfocusoutonsapfocusleave照顧的問題。

在我的自定義控件的初始化方法最終代碼:

var me = this; 
var numberFormat = sap.ui.core.NumberFormat.getCurrencyInstance({maxFractionDigits: 2}); 

me.addEventDelegate({ 
    onAfterRendering: function() { 
    // for formatting the figures initially when loaded from the model 
    me.bindValue({ 
     path: me.getBindingPath('value'), 
     formatter: function(value) { 
     return numberFormat.format(value); 
     } 
    }); 
    }, 
    onfocusin: function() { 
    // to remove formatting when the user sets focus to the input field 
    me.bindValue(me.getBindingPath('value')); 
    }, 
    onsapfocusleave: function() { 
    me.bindValue({ 
     path: me.getBindingPath('value'), 
     formatter: function(value) { 
     return numberFormat.format(value); 
     } 
    }); 
    } 
});