function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
daisy1153daisy1153 

apexでデバイス判定

お世話になります。

visualforceで、データをテーブルで表示する際、
デバイスによって、表示する件数を変更したいと考えております。
画面が描画されたときに、javascriptで取得したデバイス情報を、
コントローラーに渡そうとしましたが、渡すことができませんでした。
これはjavascriptの処理が最後なので、コントローラーに渡らないようです。
どなたか、ご存知でしたら、ご教示いただけますでしょうか。
 
Best Answer chosen by daisy1153
Taiki YoshikawaTaiki Yoshikawa
<apex:form id="form">
  <apex:actionFunction name="debug" action="{!TestAction}" reRender="form">
    <apex:param name="param" value=""/>
  </apex:actionFunction>
</form>
こんな感じでreRenderを宣言すると解決するかもしれません。

All Answers

Taiki YoshikawaTaiki Yoshikawa
JavaScriptからactionFunctionを呼び出してApexクラスの変数に値を渡して処理を行うのはどうでしょうか。
もしくは、この場合はRemoteActionをメイン作り込んでいく方がいいかもしれません。
daisy1153daisy1153
Taiki様

ご回答ありがとうございます。
actionFunction、RemoteActionともにですが、画面上で何かしらのアクション(ボタンをクリック等)で、
コントローラーに渡るかと存じます。こちらの認識が間違っておりましたら、ご指摘願えます。
一番最初に描画される(visualforceのaction)時に、値が取得できればと思っておりますが、
こちらは可能でしょうか
Taiki YoshikawaTaiki Yoshikawa
JavaScriptからApexクラスのメソッドを呼び出すので画面表示のタイミングで処理を実行することは可能だと思います。
ただ、コンストラクタやpageのactionの処理とは別のタイミングで実行されることになります。
daisy1153daisy1153
Taiki様

window.on('load')~のような形で、anctionFunctionを呼び、
actionFunctionに指定した、コントローラーのメソッドを呼ぶ。
その際、javascriptで取得した、デバイス情報をパラメーターで渡す。
このようなイメージであっておりますでしょうか。

 
Taiki YoshikawaTaiki Yoshikawa
はい。そのようなイメージです。
daisy1153daisy1153
Taiki様

サンプルを作成したのですが、画面描画のループとなってしまいました。

Controller
public class SampleController(){
  public string DeviceInfo {get; set;}
  public SampleController(){}

  public void init(){
  }

  public void TestActoin(){
    system.debug('here');
  }
}

visualforce
<apex:page controller="SampleController" action="{!init}" showHeader="true" sidebar="true">
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1"/>
  <apex:includeScript value="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js" />
  <apex:includeScript value="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js" />
  <script>
    $(window).on('load', function(){
      var ua = window.navigator.userAgent.toLowerCase();      
      debug();
    });
  </script>
</head>
<apex:form>
  <apex:actionFunction name="debug" action="{!TestAction}">
    <apex:param name="param" value=""/>
  </apex:actionFunction>
</form>
</apex:page>

上記のように、「on('load', function~)」内で、「actionFunction」を呼んでいるのですが、
「actoinFunction」のリレンダーによりループになっているようです。
最終的には、コントローラーの変数「DeviceInfo」に「var ua」の情報を渡したいと思っております。
度々の質問で申し訳ないのですが、アドバイス頂けないでしょうか。

よろしくお願い申し上げます。

 
Taiki YoshikawaTaiki Yoshikawa
<apex:form id="form">
  <apex:actionFunction name="debug" action="{!TestAction}" reRender="form">
    <apex:param name="param" value=""/>
  </apex:actionFunction>
</form>
こんな感じでreRenderを宣言すると解決するかもしれません。
This was selected as the best answer
daisy1153daisy1153
Taiki様

ありがとうございます。
ループすることなく描画されるようになりました。
大変助かりました。
誠に、ありがとうございました。