4

これが私がやりたいことです。ボタン付きのカスタム コントロールがあります。ページにドロップした場合、ボタンが押されたときの動作をエンド ユーザー プログラマーに定義してもらいます。

これを達成する方法について3つのアイデアがありましたが、それらが可能かどうかはわかりません。もちろん、方法もわかりません。

  1. カスタム プロパティを介して関数を渡します。ボタンはそのカスタム プロパティを関数として呼び出します。これは可能ですか?もしそうなら、どうすればいいですか?試してみましたが、うまくいかないようでした。

    compositeData.ssjs_clickOK("Hello World");

  2. カスタム コントロールのカスタム イベントを定義します。これは可能ですか?それはどのように行われるでしょうか。

  3. ユーザー プログラマーが定義する必要がある一意の関数名をボタンで呼び出すようにします。少し面倒に見えますが、うまくいくかもしれません。関数が定義されているかどうかをボタン コードで確認するにはどうすればよいですか? (MySpecialFunction != null) の場合は機能しますか?

4

4 に答える 4

5

アプリケーションの 1 つで以下を使用して、カスタム コントロールに関数を渡しています。

1) カスタム コントロールで、アクション ボタンで実行される関数を保持するプロパティを追加します。私は「querySave」と呼びます。プロパティ タイプは「javax.faces.el.MethodBinding」である必要があります。エディターは「メソッド バインディング エディター」である必要があります。

2)。この例のカスタム コントロールのアクション ボタンの背後にあるコードを次に示します。

if (compositeData.querySave) if (!compositeData.querySave.call()) return;
currentDocument.save();

これは、「querySave」プロパティで関数が定義されている場合は、それを呼び出します。関数が false を返す場合、ドキュメントを保存しないでください。

3) アクション ボタンに必要な処理を行う SSJS 関数を定義します。私は通常、SSJS ライブラリに配置します。XPage が関数にアクセスできることを確認してください。

4) このコントロールを含む XPage で、ステップ 1 で作成したプロパティー (この例では querySave) のエディターを使用して、ステップ 3 で作成した関数の名前を入力します。重要: 括弧やパラメーターを追加しないでください。関数名を入力すると、アクション ボタンをクリックしたときではなく、ロード時に関数が実行されます。また、エディターにコードを直接追加しないでください。関数名だけを追加してください。このエディタのコードはロード時にも実行されます。

Experts Exchange で回答してくれた Bill Hanson に感謝します。

--

アップデート:

問題の SSJS 関数が validateDocument と呼ばれるカスタム プロパティを持つカスタム コントロールの具体的な例を次に示します。

<xc:component_buttons>
    <xc:this.validateFunctionName><![CDATA[#{javascript:validateDocument}]]></xc:this.validateFunctionName>
</xc:component_buttons>

関数を呼び出すカスタム コントロールのボタンの例を次に示します。

<xp:button id="submit" value="Save">
    <xp:eventHandler event="onclick" submit="true" refreshMode="complete">
        <xp:this.action>
            <xp:actionGroup>
                <xp:this.condition><![CDATA[#{javascript:
                if (compositeData.validateFunctionName) {
                    compositeData.validateFunctionName.call();
                }}]]>
                </xp:this.condition>
                <xp:save></xp:save>
            </xp:actionGroup>
        </xp:this.action>
    </xp:eventHandler>
</xp:button>
于 2012-08-22T13:12:59.830 に答える
4

この質問を見てください: Javascript コードをカスタム コントロールに渡す

私の答えは、メソッド バインディングを介してカスタム コントロールから SSJS コードを渡す方法を説明しています。

編集:

  1. カスタム コントロール「ccSSJS」を作成する
  2. プロパティssjsCodeを CC に追加します
    • タイプ: javax.faces.el.MethodBinding
    • エディター: メソッド バインディング エディター
  3. CCのソースはこちら

    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    
       <xp:button value="Label" id="button1">
         <xp:eventHandler event="onclick" submit="true"
            refreshMode="complete">
            <xp:this.action>
               <![CDATA[#{javascript:
                  var args = new Array();
                  args["abc"] = "123";
                  args["cde"] = "456";
                  compositeData.ssjsCode.invoke( facesContext, null );
               }]]>
            </xp:this.action>
         </xp:eventHandler>
       </xp:button>
    </xp:view>
    
  4. XPage を作成してカスタム コントロールを追加する

    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom">
    
    <xc:ccSSJS>
          <xc:this.ssjsCode>
             <![CDATA[#{javascript:
                var app = facesContext.getApplication();
                app.createMethodBinding("#{javascript:print( args['abc'] )}", null); 
             }]]>
          </xc:this.ssjsCode>
       </xc:ccSSJS>
    
    </xp:view>
    

カスタム コントロールのボタンをクリックすると、メソッドssjsCodeが呼び出されます。

于 2012-08-22T12:47:04.177 に答える
1

カスタム コントロールを含むページの任意の場所に任意のイベント ハンドラーを定義し、必ず ID を指定してください。

<xp:eventHandler id="customEvent" event="customEvent">
<xp:this.action>
<![CDATA[#{javascript://your custom code}]]>
</xp:this.action>
</xp:eventHandler>

その後、そのイベント ハンドラーに関連付けられたメソッド バインディングを、MethodBinding (または「オブジェクト」) を受け入れるカスタム コントロールのカスタム プロパティに渡すことができます。

getComponent("customEvent").getAction();

次に、カスタム コントロール内から、メソッド バインディングを直接呼び出すことができます。

var customMethod = compositeData.get("customEvent");
var customArguments = compositeData.get("customEventArguments");
customMethod.invoke(facesContext, customArguments);

カスタム コントロールの「customEventArguments」プロパティが複数を許可するように設定されていることを確認してください。これにより、invoke メソッドが期待するプロパティが配列として扱われます。

于 2012-08-22T15:47:12.743 に答える
0

これが 4 番目のオプションです。カスタム コントロールにボタンを含めないでください。代わりに、編集可能領域を追加しid="actionButton"ます。カスタム コントロールのデザイン定義で次のようなものを使用して、ボタンを追加する必要がある場所を開発者に伝えることができます。

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" style="background-color:#4a4a4a;color:#fff;">
Add a button to the facet below.<br/>
<xp:callback facetName="actionButton" id="callback1"></xp:callback>
</xp:view>

デザイン定義に xp:callback を含めると、実行時に開発者がボタンを追加するためのドロップ領域が提供されます。(ボタンは、パネルまたは他のコンテナー コントロールにある必要があるかもしれませんが、よくわかりません)。カスタマー コントロールに既に他の編集可能領域がある場合は、それらもデザイン定義に含める必要があります。

于 2014-08-19T09:35:49.280 に答える