3

8.5.3 UP1 を使用。「hide/whens」またはより正確にはxpages「show/ifs」に使用しているSSJSスクリプトライブラリに問題があります。いずれにせよ、グローバル変数は、スクリプト ライブラリを最後に保存したときの値を取得しているようです。ドキュメントの現在の値に基づいて計算していないようです。これは既知のことですか (明らかに私には知られていません)。この問題を示すサンプル ページとスクリプト ライブラリを次に示します。

XPage の例:

<xp:this.resources>
    <xp:script src="/ssjsVisTest.jss" clientSide="false"></xp:script>
</xp:this.resources>
<xp:inputText id="inputText1" value="#{document1.StatusTX}"></xp:inputText>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:button value="Save" id="SaveBtn">
    <xp:eventHandler event="onclick" submit="true"
        refreshMode="complete">
        <xp:this.action>
            <xp:saveDocument var="document1"></xp:saveDocument>
        </xp:this.action>
    </xp:eventHandler>
</xp:button>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:label id="label1" value="Status is Draft"
    rendered="#{javascript:statusVisibleDraft()}">
</xp:label>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:label id="label2" value="Status is Pending"
    rendered="#{javascript:statusVisiblePending()}">
</xp:label>
<xp:br></xp:br>
<xp:br></xp:br>
</xp:view>

サンプル SSJS スクリプト ライブラリ:

var status = document1.getItemValueString('StatusTX');

function statusVisibleDraft() {

x = (status == "Draft") ? 1 : 0;

if(x > 0) {
    return true;
} else {
    return false;
}
}

function statusVisiblePending() {

x = (status == "Pending") ? 1 : 0;

if(x > 0) {
    return true;
} else {
    return false;
}
}

何か案は?ありがとう

4

3 に答える 3

4

スクリプト ライブラリ内の変数は、本質的に一時的なものです。システムの負荷によっては、呼び出しの間にライブラリがアンロードされる場合があります。グローバル変数の適切な場所はスコープです (これがスコープの目的です)。あなたの例では、ビュースコープが適切であるようです。また、Sven は計算についても正しいです。さらに、副次的な依存関係を持たないことをお勧めします。別の名前で別のデータ ソースを追加すると、ssjs ライブラリを再利用できなくなります。たとえば beforeRenderResult でデータ ソースをパラメーターとして引き渡します。 : viewScope.statusDraftVisible=true; // または false

次に、 render="#{JavaScript:viewscope.statusDraftVisible}" を持っています

アプリケーションがより複雑で、これらのチェックが多数ある場合は、viewScope の「バッキング Bean」、別名マネージド Bean を検討することができます。これにより、レンダリングが render="#{beanName.statusDraftVisible}" に減少する可能性があります

どちらが速いですか。

于 2012-04-10T01:13:55.810 に答える
2

これは、 statusVisibleDraft() および statusVisiblePending() 関数の外部にあるため、関数への呼び出しごとにステータス変数が設定されていないためだと思います。

各関数内でステータス変数の割り当てを移動します。

var statusVisibleDraft = function() {

  var status = document1.getItemValueString('StatusTX');

  x = (status == "Draft") ? 1 : 0;

  if(x > 0) {
      return true;
  } else {
      return false;
  }
}

var statusVisiblePending = function() {

  var status = document1.getItemValueString('StatusTX');

  x = (status == "Pending") ? 1 : 0;

  if(x > 0) {
      return true;
  } else {
      return false;
 }
}
于 2012-04-09T20:13:25.750 に答える
2

SSJS ライブラリのコードは、ライブラリが読み込まれている場合にのみ実行されます。ドミノ サーバーはライブラリを内部的にキャッシュします。SSJS ライブラリまたは埋め込み XPage を保存した場合にのみ、ライブラリが再ロードされ、再度実行されます。

ブラウザで XPage を再ロードしても、SSJS ライブラリは再ロードまたは再実行されません。ブラウザーを閉じて XPage を再度開いても、Domino はそれらを更新しません。

SSJS ライブラリに print ステートメントをいくつか追加するだけで、サーバー コンソールで動作を確認できます。

多分これはあなたが探している答えです。

これがスヴェンに役立つことを願っています

編集: これは、SSJS ライブラリが最初に読み込まれたときにのみ、グローバル変数のステータスが計算されることを意味します。

于 2012-04-09T20:18:00.960 に答える