0

以下のように、必要なプロパティが計算された(動的に計算された)dojo検証テキストボックスがxpageにあります

var syn = getComponent("SynCboxGrp").getValue();
if (syn == "Yes")
{return true;
}else{
    return false;
}

ここで、コンポーネント SynCboxGrp はラジオ ボタンです。ラジオ ボタンの値に基づいて、テキスト ボックスが必要です。しかし、それは正しく機能していません。ラジオ ボタンの値を変更しても、必要な動作は変わりません。

どんな助けにも感謝します


アップデート

stwissel、Per Henrik Lausten、Eric に感謝します。このssjsは必須プロパティにしかありません

<xe:djValidationTextBox id="UBOCAgent"                      value="#{dsRacDoc.UBOCAgent}"                       disableClientSideValidation="true">
<xe:this.required><![CDATA[#{javascript:var syn = getComponent("SynCboxGrp").getValue();

if (syn == "Yes")
{
    return true;
}else{
    return false;
}
}]]></xe:this.required>
</xe:djValidationTextBox>  

また、ラジオボタンのonclickイベントでこの部分的な更新コードを試しましたXSP.partialRefreshGet("#{id:UBOCAgent}");

これでも動作は変わりません。ラジオボタンの初期値に基づいて機能します。マイナス面としては、get リクエストであるため、サーバーからフィールドの内容を更新します。また、クライアントの検証を無効にするエリックの提案を試みましたが、それは役に立ちませんでした。

エリック、私も可能な限り CSJS を使用しようとしていますが、この場合、必要なプロパティには SSJS オプションしかありません。CSJSを試す方法がわかりません。entension lib の dojo フィールドを使用する代わりに、独自の dojo フィールドを作成してみる必要がありますか? もしそうなら、そのために必要なプロパティを計算する方法がわかりません。サンプルコードを教えていただけると助かります。御時間ありがとうございます。

4

2 に答える 2

1

Dojo Validation Text Box を更新する partialRefreshGet を実行しています。ただし、ラジオから更新された値をポストバックすることはないため、ラジオ ボタンのサーバー側の値は初期値のままです。したがって、required は依然として false です。

Dojo 検証テキスト ボックスで必要な場合はマークアップを確認しますが、検証はクライアント側でトリガーされるため、優先ルートである場合は CSJS を介して操作できる属性がマークアップに含まれている必要があります。

回避する必要がある特定の遅延の問題はありますか? これと、ボタンをクリックしてデータベースを検索することについての他の質問を取り上げると、いくつかの問題にぶつかっています。あなたが XPages 開発の経験がどれくらいあるかはわかりませんが、クライアント側の出力とサーバー側のコンポーネント ツリーを十分に理解していなければ、このアプローチはお勧めできません。ブラウザーに渡される CSJS の量が原因で、XPage の最初のページ読み込みも遅くなり、ブラウザーに渡される HTML のサイズが大きくなります。

ブラウザーからサーバーへのネットワークが重大な問題になる状況を除いて、組み込みの部分更新を使用し、データのサブセットを投稿する独自の部分更新のコーディングにフォールバックすることをお勧めします。私の経験では、開発がより簡単かつ迅速で、デバッグがより簡単で、より柔軟です。

この特定のシナリオでは、部分的な更新を自分でコーディングするか、組み込みの機能を使用するかに関係なく、確信が持てない点が 1 つあります。Dojo Validation Text Box で検証を設定すると、その検証がクライアント側で実行され、サーバーに投稿することによって必要なプロパティの設定を解除しようとする試みに影響を与える可能性があります。私はテストしていないので、確実ではありません。

于 2012-11-16T23:54:20.607 に答える
0

次の 2 つのいずれかです。

  1. 前述のように、SSJS 値の変更をトリガーするには、上記のコードを含む要素を (少なくとも) 部分的に更新してください。コンテナ要素で実行できます。また、フィールドの disableClientSideValidation パラメータが設定されているかどうかを確認します ([すべてのプロパティ] ビュー)。
  2. SSJSコードをCSJSに変換します(これは、はいまたはそうでない場合のバイナリ評価を返すだけです。私はいいえと仮定しています)

最近、現在のプロジェクトの最初の開発の後、サーバー側のコールバックを減らすために、CSJS アプローチを好むようになりました。特に、コンポーネントの表示/レンダリングだけを達成しようとしている状況では特にそうです。この方法を使用する場合は、dojo.byId("#{id:myControlsServerNameHere}").value (テキスト フィールドの場合、ラジオ ボタンの値のスクレイピングについては以下を参照) を表示または可視CSS プロパティの設定と組み合わせると、ハンディ。ドキュメントで説明されているように、ページに存在させたいが表示したくない場合 (書式設定の目的で、デフォルト値を保持することもできます)、可視性ルートに移動し、それ以外の場合はプロパティを表示します。

私が現在使用している無線値の CSJS スクレイプは次のとおりです。

var result=null;
for(i=0; i<document.forms[0].elements.length;i++){
    if(document.forms[0].elements[i].name=="#{id:serverNameOfRadioElement}"){
        if(document.forms[0].elements[i].checked == true){
            result=document.forms[0].elements[i].value;
            break;
        }
    }
}
//then handle your result, either with an if, or switch statement

お役に立てれば。他にも問題がある場合は、全体像を把握するためにコードを追加して投稿してください。

于 2012-11-15T13:46:26.957 に答える