2012-04-09 15 views
3

8.5.3 UP1を使用しています。私は、 "hide/whens"またはもっと正確にxpages "show/ifs"に使用しているSSJSスクリプトライブラリに問題があります。いずれにしても、グローバル変数は、スクリプトライブラリを最後に保存したときの値をとっているようです。彼らはドキュメントの現在の値に基づいて計算していないようです。これは知られていることです(明らかに私には知られていません)。ここでは、問題を実証するサンプル・ページとスクリプトライブラリです: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

スクリプトライブラリの変数は、本質的に一時的です。システム負荷に応じて、ライブラリは呼び出し間でアンロードされる可能性があります。グローバル変数の適切な場所はスコープです(これはスコープです)。あなたの例では、ビュースコープが適切であるようです。また、Svenは計算に関して正しいです。さらに、サイド依存関係を持たないことをお勧めします。異なる名前の別のデータソースを追加すると、ssjs libを再利用できなくなります。たとえば、データソースをパラメータとして渡します。このような関数の内部では、フィールド(2番目のパラメータ)が存在し、3番目のパラメータの値を持っているかどうかをチェックし、次に設定します。 viewScope.statusDraftVisible = true; //またはfalse

次に、あなたがレンダリングされている=「#{JavaScriptを:viewscope.statusDraftVisible}」アプリケーションは、より複雑で、あなたはこれらのチェックの多くを持っている場合は

、あなたがviewScope「バッキングBeanを検討するかもしれません'別名マネージドビーン。これは、= "#{} beanName.statusDraftVisible" 高速です

レンダリング にレンダリング減らすことができます。

+0

残念ながら、私が扱っているhide/whenは単純にフィールドx = value xよりもはるかに複雑です。私は例でそれを使用していました。彼らは通常、評価するために3つまたは4つの異なる条件を有する。私は、おそらくviewScope変数は行く方法だと思います。情報をありがとう。 –

+0

Dan、この場合はhideWhenの結果と他のビジネスロジックを提供するバッキングBeanの使用を強くお勧めします。 viewScopeマネージドBeanを使用してBean内にドキュメントを格納しない場合は、注意してください。 [FieldName]を取得し、[FieldName]プロパティとload(unid)を設定し、save()関数(unidが新しいドキュメントに入力されなかった場合)とsetDBURL()を使用して現在のデータベースをデフォルト値に上書きすることができます。 – stwissel

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; 
} 
} 
+0

ありがとうございました。変数を関数に移動すると、それはうまくいくが、それはグローバル変数を持つ目的を破ることが分かった。一般的に使われているフィールドのコードを何度も何度も何度も繰り返すことを避けたかったのです。グローバルなフィールドを持つ方法はありますか、これは本当に可能ではありませんか? –

2

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

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

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

おそらく、これはあなたが探している答えです。

希望これは スヴェン

編集できます: をこれはあなたのグローバル変数状況のみSSJSライブラリがロードされる最初の時間を計算することを意味します。

+0

ありがとうございます。スクリプトライブラリにグローバル変数を持たせる別の方法はありますか?あるいは、スコープ変数を使ってそのようなことをする必要がありますか? –

関連する問題