2

コメント付きのコードを使用すると、XPage で奇妙な動作が発生しました。

この問題が発生した場所でhtmlを出力する多くのコードを含むテキストフィールドがありました。開発中にいくつかのフィールドと他のフィールドで多くの問題が発生したため、フィールドが何をしているのかをよりよく理解するために、コードをトラブルフィールドからテキストフィールド内のコメントにコピーして、他のコードが見えるようにすることにしました。しかし、問題が見つかるまで、xPage の動作がおかしくなり始めました。

以下のコードは、私の問題を引き起こした例です.2つのテキストフィールドがあり、1つはスコープvarを設定し、同じvarを設定するがコメントされているコメントもあり、もう1つはScopeVarを示しています。これにより、2 番目のテキスト ボックスに「現在地」が出力されると思っていましたが、代わりに「ふふ、私はここにいます」と表示されました。

        <xp:text escape="true" id="computedField7">
            <xp:this.value><![CDATA[#{javascript://
                sessionScope.put("findme","where i am");
                /* #{javascript:sessionScope.put("findme","HuHu I am here!");} */
                return sessionScope.findme;}]]></xp:this.value>
        </xp:text>
        <xp:br></xp:br>
        <xp:text escape="true" id="computedField6"
            value="#{javascript:return sessionScope.findme;}">
        </xp:text>

この問題に遭遇した元のコードでは、古い #{} el をコメントアウトして代わりに JavaScript を使用したかったのですが、コードの途中で el をコメントのままにしておきました..同じ結果です。コメントで #{ または ${ を使用すると、常に計算されるようです!

ノート 9 でこれを修正しました。現在、8.5.3 を使用しています。

更新: ちょっとした注意: dojoAttribute queryExpr を使用するときは注意してください。クエリは SSJS のように見え、SSJS"${0}"として解釈されるからです。私は今これを使用します:

<xe:this.queryExpr><![CDATA[${javascript:"*$\{0}*";}]]></xe:this.queryExpr>

それを機能させるために。のヒントを提供してくれたPaul Stephen Withersに感謝し\{ます。

4

2 に答える 2

1

あなたの例で #{javascript:...} が #{javascript:...} 内にネストされている理由はありますか。良い結果が得られるとは思わないので、強くお勧めしません。

JS コードでの getClientId() 計算の停止に対する私の回答も参照してください。設計されておらず、機能するように変更される可能性が低い方法で機能することを期待していると思います。

プロパティは、実行時に左から右に読み取られる単なる文字列です。「#{javascript:」、「${javascript:」または「#{..」が見つかった場合、結果のコードが実行されます。それらを「//」で囲んだり、「/ 」と「 /」をどちらかの側で囲んだりしても効果はありません。文字列全体がパーサーに渡されるのではなく、"#{javascript" の後のビットだけが渡されます。

これの利点は、言語を組み合わせることでパフォーマンスが向上することです。これは、その一部のみがパーサーに渡され、リテラル文字列 (「/*」ビットが何であるか) がそのままブラウザーに渡されるためです。これは、EL と SSJS を 1 つの値に含めることができることを意味します。探している変更が行われた場合、それができるかどうかはわかりません。

queryExpr については、代わりに ${javascript:" ${0} "} を使用することをお勧めします。{. p121 XPages 拡張ライブラリを参照してください。

于 2014-02-05T14:02:30.893 に答える
1

これは面白いバグです。

これは、JavaScript インタープリターのプリプロセッサー機能が原因です。通常、CSJS コードを記述して、レンダリングされたページに配置される#{javascript:...}にコードの一部を置き換えることができます。

あなたの場合、それはSSJSです。繰り返しますが、インタープリターは#{javascript:...}SSJS コードの内部を置き換えて、作業が完了したと考えます。このようにして、実行されたコードの結果ではなく、レンダリングされたページにコードが表示されます。

レンダリングされたページ

#回避策として、から削除するだけで、/* #{javascript...期待どおりに機能します。

于 2013-10-30T10:32:07.380 に答える