2

これが私がやりたいことです:

XPage で、ユーザーが Enter キーを押したときにサーバー側のコード (Java Bean または SSJS) を呼び出す編集ボックス コントロールが必要です。これの主な使用例は、このページが iPad から実行され、Bluetooth バーコード スキャナーが接続されていることです。このスキャナはキーボードをエミュレートします。ユーザーは編集ボックスをタップします。次に、スキャナーでスキャンし、「Enter」キーとともにバーコードを入力します。次のスキャンのために編集ボックスをすぐにクリアする必要があり、スキャンの値を処理する必要があります。この処理は、Java Bean に対してさまざまなバックエンド処理を行い、ページに表示されるメッセージを返します。基本的にこれらの 1 つ: 1. アイテムが見つからない、2. アイテムが使用可能であり、割り当てられている、3. アイテムは既に割り当てられているが、とにかくそれを持つことができる 4. アイテムが使用できない

このためのコードがあり、全体的にコア コードは正常に動作しています。通常は onchange イベントを使用していましたが、この問題が発生したため、onkeypress イベントに移行しました。これは、IE で実行できるようにするための試みでした。繰り返しになりますが、目標は iPad/Safari のみですが、デスクトップ ブラウザーでも動作するようにしたいと考えています。私は現在、丁目でのみテストしています。

編集ボックスの CSJS 部分には、次のコードがあります。

var e = dojo.fixEvent(thisEvent);
if (e.keyCode == dojo.keys.ENTER) {
return true;
} else {
return false;
}

考えているのは、Enter でのみ SSJS を呼び出したいということです。

エディット ボックスをクリアし、値を処理してから、いくつかの viewScope 変数を設定する SSJS コードを次に示します。

// Get the value off the page and put it in to the key variable
var key:String = getComponent("scanBox").getValue();
// clear the scanbox so it's ready for the next scan.
getComponent("scanBox").setValue("");
//Managed Bean to hold the last scan value - since the scanbox is cleared we do want to show the value
Scan.setLastScan(key);

// Managed Bean to process the item.
AddToJob.processItem(key);

viewScope.put("vsShowAssignPanel", true);
viewScope.put("vsShowMessagePanel", false);

SSJS コードは、ページのメイン コンテンツを部分的に更新するように設定されています。私はブートストラップを使用しており、上部と下部のナビゲーション バーを除くページ上のすべてを更新しようとしています。スキャン後に値をクリアしているため、編集ボックス自体は部分的な更新ゾーンにあります。

最後に問題は次のとおりです。

ボタンの SSJS コードは 2 回実行されています。何らかの理由ですべてではありませんが、おそらく 90% の確率で発生します。2 回クリックしていません。私がテストする方法は、デスクトップで Chrome を使用することです。フィールドに値を貼り付けて、キーボードで Enter キーを 1 回押します。

バーコードをスキャンしてアイテムを割り当てようとしている場合。最初は問題なく動きます。オブジェクトを更新し、フィールドをバックエンドの NotesDocument に保存して割り当て済みとしてマークします。欲しいだけ。しかし、2回目のヒットで、アイテムがすでに割り当てられていることを思いとどまらせ、間違ったメッセージを返します。

多くの試行錯誤の後、JSF ライフサイクルの何かがこれを 2 回実行させていることはかなり確信しています。なぜ私はわからない。一度手に入れる方法がわかりません。

これまでに見つけた唯一の適切な回避策は、「AddToJob.processItem」メソッドです。「AddToJob」は、viewScope のマネージド Bean です。そこに最後のバーコードを保存して保持します。次に、値が同じであることを確認するためにチェックを行います。もしそうなら、私はそれが2回目の実行であると仮定し、処理を停止します。

私は何年もの間、エディット コントロールの on change イベントでコードを呼び出すという基本的な概念を使用してきました。しかし、それは XPages Mobile Controls 内にあり、動作が少し異なる場合があります。XPages Mobile コントロールではなく Bootstrap を使用するように、このアプリを書き直そうとしています。

以下は、編集コントロールの完全な XML マークアップです。

<xp:inputText id="scanBox" styleClass="newTarget">
<xp:this.attrs>
    <xp:attr name="placeholder" value="Tap to Scan..." />
    <xp:attr name="autocorrect" value="off" />
</xp:this.attrs>
<xp:this.dojoAttributes>
    <xp:dojoAttribute name="autocorrect" value="off" />
</xp:this.dojoAttributes>
<xp:eventHandler event="onkeypress" submit="true" refreshMode="partial" refreshId="mainPanel">
<xp:this.script><![CDATA[var e = dojo.fixEvent(thisEvent);
if (e.keyCode == dojo.keys.ENTER) {
return true;
} else {
return false;
}]]></xp:this.script>
<xp:this.action><![CDATA[#{javascript:// Get the value off the page and put it in to the key variable
var key:String = getComponent("scanBox").getValue();
// clear the scanbox so it's ready for the next scan.
getComponent("scanBox").setValue("");

//Managed Bean to hold the last scan value - since the scanbox is cleared we do want to show the value
Scan.setLastScan(key);

// Managed Bean to process the item.
AddToJob.processItem(key);

viewScope.put("vsShowAssignPanel", true);
viewScope.put("vsShowMessagePanel", false);}]]></xp:this.action>
</xp:eventHandler></xp:inputText>

どんな情報でも大歓迎です。どうもありがとうございました!!!

4

3 に答える 3

0

ここで何かが欠けている場合はご容赦ください。しかし、あなたは不必要に複雑なデザインを設定しているように思えます。

なぜ CSJS や SSJS が必要なのですか?

つまり、単純なマークアップと Bean を使って処理を試みましたか?

マークアップの例:

<xp:panel
id="panelbarcode">
<xp:inputText
    id="barcode1"
    value="#{MyBean.barcode}">
    <xp:eventHandler
        event="onchange"
        submit="true"
        refreshMode="partial"
        refreshId="panelbarcode" />
</xp:inputText>
</xp:panel>

Bean コードの例:

public class MyBean implements Serializable {

private static final long serialVersionUID = 8541L;

// Zero-Argument Constructor
public MyBean() {}

public String getBarcode() {
    // give out a barcode here, 
    // or return "" for an empty barcode
    return "";
} 

public void setBarCode(String barcode) { 
    // process the scanned in barcode 
} 
}

(愚かな「onClick」イベントを取り除くために編集されました)

于 2013-10-30T17:32:38.023 に答える
0

デビッド、

特定の XPages ソリューションではありませんが、バーコードがスキャンされた Notes クライアントでこれを行う必要がありました。バーコードが処理され、フィールドがクリアされ、次のフィールドがスキャンインされました。オペレーターはクライアントにいませんでした。 (そのBluetoothスキャナー)。

私の解決策と私が認めたのは、NotesTimer を使用することでした。これにより、フィールドの内容が空であるかどうか、または以前と同じ値であるかどうかが確認されました。部分スキャンをキャッチしていないことを確認するために、チェックを 2 回行い、値が変わらない場合はそれを処理しました。

結局のところ、Javascript タイマーを使用して同じロジックに従うことはできませんか?

于 2013-10-30T17:56:22.943 に答える