いいね!数

0

閲覧数
473

文書の競合を回避するために、ある方法を試してみています。

フォーム上のボタンのssjsで、スクリプトに保存してある関数(function)を呼び出しています。

関数の中ではある条件に該当した場合にアラートを表示させるように以下の式が設定されています。

 

function isLock(lockJoho,kyogoDoc){
 ----省略------
    if(lockJoho!=null && lockJoho.equals(datestr)){
    return "OK"    ;
    }else{
        var uName=@Name("[CN]",lockUser2[0]);
        view.postScript( "alert('" + uName + "さんが文書を編集しました。')" );    
        return "NO";
    }
}

ところが、上記の赤字部分のview.postScriptでエラーが出てしまいます。

エラーの内容は以下の通りです。

JavaScript アクション式を実行中にエラーが発生しました
スクリプトインタープリタエラー、行=184、列=22: [TypeError] タイプ「lotus.domino.local.View [Static Java Interface Wrapper, lotus.domino.local.View: lotus.domino.View]」のオブジェクトでメソッド「postScript(string)」を呼び出し中にエラーが発生しました
   at [/function.jss].isLock(2016/11/17 14:14:15 ZE9,E4D1F90BDBE68A294925806E000DD598)   

何が問題でエラーが出るのか、どうしてもわかりません。

何かヒントがあればお願いします。

サーバー情報: | クライアント情報: | 
カテゴリ:アプリ開発 - XPages | タグ:
  | 質問日時:Nov 17, 2016, 2:27:54 PM

回答・コメント

いいね!数

0

原因はfunctionを読んでいる元のコードで以下を使っていたからでした。

    var view = database.getView("DocID_V");

初歩的な問題でした・・。

しかし、これが解決したら、今度はまた別の問題が出てきました。

functionの結果として”NO”は返ってくるのですが、view.postScriptが無視されてしまうのか

「◎◎さんが文書を編集しました」というポップアップが出てきません。

これはなぜでしょうか・・・?

回答日時:Nov 17, 2016, 5:36:53 PM

いいね!数

0

今回の場合、本質的には、isLock()を呼ぶかどうかは関係ないはずですから、あるボタンのイベントハンドラにSSJSでview.postScript()でalert("test")をブラウザに送ったのと同等のはずですよね。

だったら質問するときには問題を再現できる最も単純化させた状況で聞くべきです。

この場合、ボタンのイベントパンドラにview.postScriptでalert()書いたけど、ポップアップが出ない、と聞くべき。

実際、そう書き直した時、どうなります?当然、メッセージも単純化して固定文字列にするんですよ。

単純化した分、答えも見えてくるんじゃない?

回答日時:Nov 17, 2016, 8:36:18 PM

いいね!数

0

view.postScript 実行の前提条件として、サブミットが実行され、かつ画面遷移が発生しないことが
必要になりますがそこは大丈夫ですか?

回答日時:Nov 18, 2016, 8:59:22 AM

いいね!数

0

yac4423さん、

コメントありがとうございます。状況がわかったほうが良いかと無駄なことまで

書いてしまいました。気をつけたいと思います。

ykawaさん、

ご回答ありがとうございました。

まさに画面遷移が発生していることが問題でした。

関数が戻ってきたあと、関数の値を見て、"NO"だったらreturn false;としているのですが、

そのあと、シンプルアクションで「前のページへ戻る」を設定しています。

  ①  var lockFlg = isLock(viewScope.lockJoho,sdoc);
    if(lockFlg == "NO" ){    
    return false;
    }
    }

②シンプルアクションー「前のページに戻る」

return falseでもそのあとの「前のページへ戻る」は実行されてしまうので、

ssjs上で前のページへ戻るを実行するようにコードを書き換えたところうまくいきました。

大変助かりました。感謝です。

回答日時:Nov 18, 2016, 9:35:02 AM

いいね!数

0

最近、SSJSとCSJSの連携問題で悩んでた時、どういう仕組みでXPagesが画面制御してるのか調べてました。

ブラウザのF12ツール使うと制御の裏側がちょっと見えて来ました。
ボタンクリックはPOSTメソッドで通知され、レスポンスで部分更新用のHTMLやスクリプトが返って来るか、応答ヘッダのLocation:で次に開いて欲しいページのURLが通知されてページ遷移させてる様子が見えて来ます。
 
この辺りの観測から、トラブルの原因解析できるようになると、さらなるスキルアップができるようになりますよ。
今回の場合、多分alert()とLocation:の両方がPOSTの応答で返されて、ブラウザがLocation:を優先させたんだろうと予想します。
/Yac
回答日時:Nov 18, 2016, 1:27:07 PM

いいね!数

0

yac4423さん、

有用なアドバイスをありがとうございます。

ブラウザのF12ツールを使っていろいろと裏の動きがわかりそうですね。

まさにそこから原因解析ができるようになりたいと思います。しかしなかなか

F12ツールを見ても理解ができません。これから精進してスキルアップを目指したい

です。

 

回答日時:Nov 18, 2016, 2:25:43 PM