SlideShare ist ein Scribd-Unternehmen logo
1 von 56
Downloaden Sie, um offline zu lesen
Force.com Webinar:
                                       アドバンスド Visualforce

                                       Mitsuhiro Okamoto
                                       Program Manager
                                       Developer / Platform Marketing




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
Agenda
      1. 前提条件

      2. 厄介だけどいい友達: View State

      3. View Stateの管理

      4. 非同期Apex




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
想定と難易度




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
この アドバンスド Webinar の前提条件...




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
この アドバンスド Webinar の前提条件...


      ...不明点なく、自信を持ってVisualforceが記述できる




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
この アドバンスド Webinar の前提条件...


      ...不明点なく、自信を持ってVisualforceが記述できる


      ...一般的なApexコードを書く事ができる




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
この アドバンスド Webinar の前提条件...


      ...不明点なく、自信を持ってVisualforceが記述できる


      ...一般的なApexコードを書く事ができる


      ...HTML & JavaScriptそしてAJAXのコンセプトを理解している




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
厄介だけどいい友達:
                                         View State




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
Q: View Stateとは?
      A: Apexコントローラの状態やVisualforceページの状態をサーバ
      リクエスト間も保持するための、Visualforceページ内に暗号化
      されたhiddenの <input> フィールドのこと。 このフィールドは
      <apex:form> タグがページ上にある場合のみ生成される。




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
Visualforceのライフサイクル
  A
                                                          A : URLがリクエストされる
                                               HTTP GET   B : Apexコントローラがサーバ上でインス
                                                          タンス化される
                            E                             C : コントローラの状態がView Stateに直
                        HTTP POST
                                                          列化(シリアライズ)& 暗号化されて
                                                          D : ページマークアップがブラウザに送信
   D
                                                    B     され、描画される
                                                          E : View Stateが復号 & 復元される
                                                          (PostBack時)

          <input type="hidden" value="..."/>    C


ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
View State: 利点と課題



                  すばらしい点 :-)                    課題 :-(
     • 自動的にフィールドの値を保持してく               • 巨大化し、パフォーマンスに影響を
       れる                              与える可能性

     • 簡単なAJAX機能を持ち合わせている              • サイズ制限(135k)を持っている
     • 非常に簡単に使えるre-renderページ           • 複雑なAJAX機能に対応しづらい
       コンポーネントを持つ




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
View Stateを必要とするもの...
   <apex:action*>
   <apex:command*>
   <apex:inlineEditSupport>
   <apex:input*>
   <apex:select*>




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
View Stateの管理




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
どのようにView Stateを管理するか?




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
どのようにView Stateを管理するか?
   A. コンポーネントの数を減らす




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
どのようにView Stateを管理するか?
   A. コンポーネントの数を減らす

   B. transient キーワードを利用する




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
どのようにView Stateを管理するか?
   A. コンポーネントの数を減らす

   B. transient キーワードを利用する

   C. JavaScript Remotingを利用する




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
どのようにView Stateを管理するか?
   A. コンポーネントの数を減らす

   B. transient キーワードを利用する

   C. JavaScript Remotingを利用する

   D. Streaming APIを利用する




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション A: コンポーネント数を減らす




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション A: コンポーネント数を減らす

         <apex:outputPanel layout="inline"...>


         <apex:outputPanel layout="block"...>


         <apex:panelGrid...>


         <apex:outputLink...>


         <apex:outputText styleClass="..."...>




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション A: コンポーネント数を減らす

         <apex:outputPanel layout="inline"...>   <span...>


         <apex:outputPanel layout="block"...>    <div...>


         <apex:panelGrid...>                     <table...>


         <apex:outputLink...>                    <a...>


         <apex:outputText styleClass="..."...>   <span...>




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション A: コンポーネント数を減らす

                                       <span...>


                                       <div...>


                                       <table...>


                                       <a...>


                                       <span...>




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション B: transient キーワード


     public with sharing class EditClientController {

     	           public            Contact         client              {   get;   set;   }
     	 transient public            List<Contact>   connections         {   get;   set;   }
     	 transient public            List<Account>   previousEmployers   {   get;   set;   }
     	 transient public            Set<String>     hashTags            {   get;   set;   }

           ...

     }




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション B: transient キーワードを使う

            BEFORE
            AFTER




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション B: transient キーワードを使う

            BEFORE




                                       57%
            AFTER




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: JavaScript Remotingを使う
   Q: JavaScript Remotingとは?

   A: ステートレスにApexコントローラ内のメソッドをJavascriptか
      ら呼ぶ方法




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: Use JavaScript Remoting



                         取引先責任者を検索:




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: Use JavaScript Remoting



                         取引先責任者を検索:




                                  <apex:actionFunction ... />
                                   <apex:actionRegion ... />
                                  <apex:actionSupport ... />




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: Use JavaScript Remoting



                         取引先責任者を検索:




                                       JavaScript Remoting




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
JavaScript Remoting のライフサイクル




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
JavaScript Remoting のライフサイクル




                                       JS Function




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
JavaScript Remoting のライフサイクル




                                       JS Function

                                       Apex Method




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
JavaScript Remoting のライフサイクル




                                       JS Function

                                       Apex Method

                                       JS Callback


ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
JavaScript Remoting のライフサイクル




                                       JS Function

                                       Apex Method

                                       JS Callback


ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
JavaScript Remoting のライフサイクル




                                       JS Function

                                       Apex Method
                                                     クライアントサイド

                                       JS Callback   サーバサイド




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
JS Function


                                       Apex Method


                                       JS Callback




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: JavaScript Remoting: ページ

 <apex:page controller="FindCustomerController">

       <input id="searchField" type="text" placeholder="姓を入力"/>
       <button onclick="handleButtonClick();">検索</button>


       <table>
           <tbody id="results"></tbody>
       </table>
                                                                  JS Function



 </apex:page>                                                     Apex Method


                                                                  JS Callback




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: JavaScript Remoting: ページ

 <apex:page controller="FindCustomerController">

       <input id="searchField" type="text" placeholder="姓を入力"/>
       <button onclick="handleButtonClick();">検索</button>


       <table>
           <tbody id="results"></tbody>
       </table>
                                                                  JS Function



 </apex:page>                                                     Apex Method


                                                                  JS Callback




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: JavaScript Remoting: ページ

 <apex:page controller="FindCustomerController">

       <input id="searchField" type="text" placeholder="姓を入力"/>
       <button onclick="handleButtonClick();">検索</button>


       <table>
           <tbody id="results"></tbody>
       </table>
                                                                  JS Function



 </apex:page>                                                     Apex Method


                                                                  JS Callback




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: JavaScript Remoting: JavaScript




     function handleButtonClick() {
         var searchTerm = document.getElementById("searchField").value;
         FindCustomerController.doSearch(searchTerm, renderResults);
     }

                                                                    JS Function


                                                                    Apex Method


                                                                    JS Callback




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: JavaScript Remoting: JavaScript




     function handleButtonClick() {
         var searchTerm = document.getElementById("searchField").value;
         FindCustomerController.doSearch(searchTerm, renderResults);
     }

                                                                    JS Function


                                                                    Apex Method


                                                                    JS Callback




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: JavaScript Remoting: JavaScript




     function handleButtonClick() {
         var searchTerm = document.getElementById("searchField").value;
         FindCustomerController.doSearch(searchTerm, renderResults);
     }
                         Apexクラス       Apexメソッド   Apexメソッドパラメータ   JSコールバック関数


                                                                               JS Function


                                                                               Apex Method


                                                                               JS Callback




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: JavaScript Remoting: Apexクラス
    public with sharing class FindCustomerController {

          @RemoteAction
          public static List<Contact> doSearch(String customerLastName) {
              customerLastName = '%' + customerLastName + '%';
              return [
                  SELECT id, FirstName, LastName
                  FROM Contact
                  WHERE LastName LIKE :customerLastName
                  LIMIT 200
              ];                                                      JS Function

          }                                                           Apex Method


                                                                           JS Callback
    }


ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: JavaScript Remoting: Apexクラス
    public with sharing class FindCustomerController {

          @RemoteAction
          public static List<Contact> doSearch(String customerLastName) {
              customerLastName = '%' + customerLastName + '%';
              return [
                  SELECT id, FirstName, LastName
                  FROM Contact
                  WHERE LastName LIKE :customerLastName
                  LIMIT 200
              ];                                                      JS Function

          }                                                           Apex Method


                                                                           JS Callback
    }


ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: JavaScript Remoting: コールバック


  function renderResults(results, event) {
      var container = document.getElementById("results"),
               html = [];
      for (var i=0, j=results.length; i<j; i++) {
          html.push("<tr><td>");
          html.push(results[i].LastName + ", " + results[i].FirstName);
          html.push("</td></tr>");
      }
      container.innerHTML = html.join("");                         JS Function

  }                                                                Apex Method


                                                                        JS Callback




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: JavaScript Remoting: 結果




                                       JS Function


                                       Apex Method


                                       JS Callback




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: JavaScript Remoting: 結果




         BEFORE                        AFTER
          440ms                        215ms




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション C: JavaScript Remoting: 結果




         BEFORE                        AFTER
          440ms                        215ms
                                        52%




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション D: Streaming APIを使う
   Q: Streaming APIとは?

   A: Salesforceインスタンスからポーリングをせずにほぼリアルタ
      イムに更新を効率よく取得する方法




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション D: Streaming APIを使う
   BEFORE
<apex:page controller="NewAccountsController">
<apex:form>

     <apex:actionPoller action="{!find}" rerender="wrapper" interval="15"/>
     <h1>Streaming API サンプル</h1>
     <h2>新規取引先</h2>
     <apex:outputPanel id="wrapper"></apex:outputPanel>

</apex:form>
</apex:page>




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション D: Streaming APIを使う
   AFTER
<apex:page controller="NewAccountsController">

     <apex:includeScript value="..."/> <!-- 4つの js ファイルを読み込み -->


     <h1>Streaming API サンプル</h1>
     <h2>新規取引先</h2>
     <div id="wrapper"></div>
     <script>... $.cometd.init(...) $.cometd.subscribe(...) ...</script>

</apex:page>




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
オプション D: Streaming APIを使う: 手順
   SOQLクエリを定義する

   PushTopicレコードを定義する

   Visualforceページに必要なJavascriptをインクルードする

   cometdのinit(...)およびsubscribe(...)を呼び出す (Inline JS)

   何が起きるかを見る




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
非同期 Apex




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
非同期 Apex
      public with sharing class SendInvoiceController{

            @RemoteAction
            public static String requestAllInvoices(String customerId) {
                sendAllInvoices(customerId);
                return('All invoices have been requested.');
            }

            @future
            private static void sendAllInvoices(String customerId) {
                EmailHelper.emailCustomerInvoices(customerId);
            }

      }


ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
Q&A

                                       Mitsuhiro Okamoto
                                       Program Manager
                                       Developer / Platform Marketing




ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar
Thank you


ハッシュタグでShareしよう: #forcewebinarjp
Join the conversation: #forcewebinar

Weitere ähnliche Inhalte

Was ist angesagt?

⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2Nishida Kansuke
 
Css Nite Word Press
Css Nite Word PressCss Nite Word Press
Css Nite Word PressWeb nist
 
Jqm20120210
Jqm20120210Jqm20120210
Jqm20120210cmtomoda
 
WordPress実践 導入からカスタマイズまで
WordPress実践 導入からカスタマイズまでWordPress実践 導入からカスタマイズまで
WordPress実践 導入からカスタマイズまでTakashi Uemura
 
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013純生 野田
 
やはりお前らのMTMLは間違っている!
やはりお前らのMTMLは間違っている!やはりお前らのMTMLは間違っている!
やはりお前らのMTMLは間違っている!純生 野田
 
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニックWordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニックTakashi Uemura
 
MTで学ぶセキュアプログラミング@MT Tokyo
MTで学ぶセキュアプログラミング@MT TokyoMTで学ぶセキュアプログラミング@MT Tokyo
MTで学ぶセキュアプログラミング@MT Tokyo純生 野田
 
What's new! TwentyThirteen + WordPress3.6
What's new! TwentyThirteen + WordPress3.6What's new! TwentyThirteen + WordPress3.6
What's new! TwentyThirteen + WordPress3.6Takashi Uemura
 

Was ist angesagt? (10)

⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2
 
Css Nite Word Press
Css Nite Word PressCss Nite Word Press
Css Nite Word Press
 
Jqm20120210
Jqm20120210Jqm20120210
Jqm20120210
 
WordPress実践 導入からカスタマイズまで
WordPress実践 導入からカスタマイズまでWordPress実践 導入からカスタマイズまで
WordPress実践 導入からカスタマイズまで
 
Inside Movable Type
Inside Movable TypeInside Movable Type
Inside Movable Type
 
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013
 
やはりお前らのMTMLは間違っている!
やはりお前らのMTMLは間違っている!やはりお前らのMTMLは間違っている!
やはりお前らのMTMLは間違っている!
 
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニックWordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
 
MTで学ぶセキュアプログラミング@MT Tokyo
MTで学ぶセキュアプログラミング@MT TokyoMTで学ぶセキュアプログラミング@MT Tokyo
MTで学ぶセキュアプログラミング@MT Tokyo
 
What's new! TwentyThirteen + WordPress3.6
What's new! TwentyThirteen + WordPress3.6What's new! TwentyThirteen + WordPress3.6
What's new! TwentyThirteen + WordPress3.6
 

Andere mochten auch

Salesforce Identityによる企業のアイデンティティ管理
Salesforce Identityによる企業のアイデンティティ管理Salesforce Identityによる企業のアイデンティティ管理
Salesforce Identityによる企業のアイデンティティ管理Salesforce Developers Japan
 
70万⼈のメンバーを駆使して開発を⾏う􏰀 〜 Topcoderが提案する新しい開発モデル ~
70万⼈のメンバーを駆使して開発を⾏う􏰀 〜 Topcoderが提案する新しい開発モデル ~70万⼈のメンバーを駆使して開発を⾏う􏰀 〜 Topcoderが提案する新しい開発モデル ~
70万⼈のメンバーを駆使して開発を⾏う􏰀 〜 Topcoderが提案する新しい開発モデル ~Salesforce Developers Japan
 
Salesforce1 で始めるモバイルアプリ開発
Salesforce1 で始めるモバイルアプリ開発Salesforce1 で始めるモバイルアプリ開発
Salesforce1 で始めるモバイルアプリ開発Salesforce Developers Japan
 

Andere mochten auch (6)

Spring '14リリース開発者向け新機能
Spring '14リリース開発者向け新機能Spring '14リリース開発者向け新機能
Spring '14リリース開発者向け新機能
 
Jp trgger and_custom_button_forsuperbeginner
Jp trgger and_custom_button_forsuperbeginnerJp trgger and_custom_button_forsuperbeginner
Jp trgger and_custom_button_forsuperbeginner
 
Salesforce Identityによる企業のアイデンティティ管理
Salesforce Identityによる企業のアイデンティティ管理Salesforce Identityによる企業のアイデンティティ管理
Salesforce Identityによる企業のアイデンティティ管理
 
70万⼈のメンバーを駆使して開発を⾏う􏰀 〜 Topcoderが提案する新しい開発モデル ~
70万⼈のメンバーを駆使して開発を⾏う􏰀 〜 Topcoderが提案する新しい開発モデル ~70万⼈のメンバーを駆使して開発を⾏う􏰀 〜 Topcoderが提案する新しい開発モデル ~
70万⼈のメンバーを駆使して開発を⾏う􏰀 〜 Topcoderが提案する新しい開発モデル ~
 
Salesforce1 で始めるモバイルアプリ開発
Salesforce1 で始めるモバイルアプリ開発Salesforce1 で始めるモバイルアプリ開発
Salesforce1 で始めるモバイルアプリ開発
 
Force.com Canvas アプリケーション
Force.com Canvas アプリケーションForce.com Canvas アプリケーション
Force.com Canvas アプリケーション
 

Ähnlich wie Force.com Weibnar : アドバンスドVisualforce

jsライブラリで実装する効率的なWeb制作
jsライブラリで実装する効率的なWeb制作jsライブラリで実装する効率的なWeb制作
jsライブラリで実装する効率的なWeb制作西畑 一馬
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーAyumu Kawaguchi
 
レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】Yasuhito Yabe
 
メディア芸術基礎 II jQuery入門
メディア芸術基礎 II jQuery入門メディア芸術基礎 II jQuery入門
メディア芸術基礎 II jQuery入門Atsushi Tadokoro
 
Lightning Experience 時代のプロセス開発
Lightning Experience 時代のプロセス開発Lightning Experience 時代のプロセス開発
Lightning Experience 時代のプロセス開発Salesforce Developers Japan
 
CoffeeScriptってなんぞ?
CoffeeScriptってなんぞ?CoffeeScriptってなんぞ?
CoffeeScriptってなんぞ?Hayato Mizuno
 
今からでも遅くない! React事始め
今からでも遅くない! React事始め今からでも遅くない! React事始め
今からでも遅くない! React事始めynaruta
 
Rails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3editionRails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3editionSatomi Tsujita
 
Rails解説セミナー: Railsアプリケーションのデバッグ
Rails解説セミナー: RailsアプリケーションのデバッグRails解説セミナー: Railsアプリケーションのデバッグ
Rails解説セミナー: RailsアプリケーションのデバッグYohei Yasukawa
 
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」fukuoka.ex
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 
CRF を使った Web 本文抽出 for WebDB Forum 2011
CRF を使った Web 本文抽出 for WebDB Forum 2011CRF を使った Web 本文抽出 for WebDB Forum 2011
CRF を使った Web 本文抽出 for WebDB Forum 2011Shuyo Nakatani
 
進化する Web ~ Progressive Web Apps の実装と応用 ~
進化する Web  ~ Progressive Web Apps の実装と応用 ~進化する Web  ~ Progressive Web Apps の実装と応用 ~
進化する Web ~ Progressive Web Apps の実装と応用 ~Microsoft Azure Japan
 
ルーター自前実装の話
ルーター自前実装の話ルーター自前実装の話
ルーター自前実装の話Kazushi Kawamura
 
Web制作のアレコレ
Web制作のアレコレWeb制作のアレコレ
Web制作のアレコレregret raym
 
Introduction for Browser Side MVC
Introduction for Browser Side MVCIntroduction for Browser Side MVC
Introduction for Browser Side MVCRyunosuke SATO
 

Ähnlich wie Force.com Weibnar : アドバンスドVisualforce (20)

Visualforce + jQuery
Visualforce + jQueryVisualforce + jQuery
Visualforce + jQuery
 
jsライブラリで実装する効率的なWeb制作
jsライブラリで実装する効率的なWeb制作jsライブラリで実装する効率的なWeb制作
jsライブラリで実装する効率的なWeb制作
 
Webteko 20090925
Webteko 20090925Webteko 20090925
Webteko 20090925
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】
 
メディア芸術基礎 II jQuery入門
メディア芸術基礎 II jQuery入門メディア芸術基礎 II jQuery入門
メディア芸術基礎 II jQuery入門
 
Lightning Experience 時代のプロセス開発
Lightning Experience 時代のプロセス開発Lightning Experience 時代のプロセス開発
Lightning Experience 時代のプロセス開発
 
CoffeeScriptってなんぞ?
CoffeeScriptってなんぞ?CoffeeScriptってなんぞ?
CoffeeScriptってなんぞ?
 
Haikara
HaikaraHaikara
Haikara
 
Pjax1
Pjax1Pjax1
Pjax1
 
今からでも遅くない! React事始め
今からでも遅くない! React事始め今からでも遅くない! React事始め
今からでも遅くない! React事始め
 
Rails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3editionRails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3edition
 
Rails解説セミナー: Railsアプリケーションのデバッグ
Rails解説セミナー: RailsアプリケーションのデバッグRails解説セミナー: Railsアプリケーションのデバッグ
Rails解説セミナー: Railsアプリケーションのデバッグ
 
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
CRF を使った Web 本文抽出 for WebDB Forum 2011
CRF を使った Web 本文抽出 for WebDB Forum 2011CRF を使った Web 本文抽出 for WebDB Forum 2011
CRF を使った Web 本文抽出 for WebDB Forum 2011
 
進化する Web ~ Progressive Web Apps の実装と応用 ~
進化する Web  ~ Progressive Web Apps の実装と応用 ~進化する Web  ~ Progressive Web Apps の実装と応用 ~
進化する Web ~ Progressive Web Apps の実装と応用 ~
 
ルーター自前実装の話
ルーター自前実装の話ルーター自前実装の話
ルーター自前実装の話
 
Web制作のアレコレ
Web制作のアレコレWeb制作のアレコレ
Web制作のアレコレ
 
Introduction for Browser Side MVC
Introduction for Browser Side MVCIntroduction for Browser Side MVC
Introduction for Browser Side MVC
 

Mehr von Salesforce Developers Japan

Salesforce DX の始め方とパートナー様成功事例
Salesforce DX の始め方とパートナー様成功事例Salesforce DX の始め方とパートナー様成功事例
Salesforce DX の始め方とパートナー様成功事例Salesforce Developers Japan
 
データ連携の新しいカタチ - 変更データキャプチャ/プラットフォームイベントを MuleSoft Anypoint Platform と組み合わせて試してみよう
データ連携の新しいカタチ - 変更データキャプチャ/プラットフォームイベントを MuleSoft Anypoint Platform と組み合わせて試してみようデータ連携の新しいカタチ - 変更データキャプチャ/プラットフォームイベントを MuleSoft Anypoint Platform と組み合わせて試してみよう
データ連携の新しいカタチ - 変更データキャプチャ/プラットフォームイベントを MuleSoft Anypoint Platform と組み合わせて試してみようSalesforce Developers Japan
 
Einstein Analyticsでのデータ取り込みと加工
Einstein Analyticsでのデータ取り込みと加工Einstein Analyticsでのデータ取り込みと加工
Einstein Analyticsでのデータ取り込みと加工Salesforce Developers Japan
 
GMOペパボのエンジニアが語るHeroku活用ノウハウ
GMOペパボのエンジニアが語るHeroku活用ノウハウGMOペパボのエンジニアが語るHeroku活用ノウハウ
GMOペパボのエンジニアが語るHeroku活用ノウハウSalesforce Developers Japan
 
Salesforce 開発者向け最新情報 Web セミナー 〜 TrailheaDX での新発表 & Summer '19 リリース新機能 〜
Salesforce 開発者向け最新情報 Web セミナー 〜 TrailheaDX での新発表 & Summer '19 リリース新機能 〜Salesforce 開発者向け最新情報 Web セミナー 〜 TrailheaDX での新発表 & Summer '19 リリース新機能 〜
Salesforce 開発者向け最新情報 Web セミナー 〜 TrailheaDX での新発表 & Summer '19 リリース新機能 〜Salesforce Developers Japan
 
Salesforce DXとLightning Web ComponentsでモダンSalesforceアプリ開発
Salesforce DXとLightning Web ComponentsでモダンSalesforceアプリ開発Salesforce DXとLightning Web ComponentsでモダンSalesforceアプリ開発
Salesforce DXとLightning Web ComponentsでモダンSalesforceアプリ開発Salesforce Developers Japan
 
Lightning時代のService Cloud概要とカスタマイズ
Lightning時代のService Cloud概要とカスタマイズLightning時代のService Cloud概要とカスタマイズ
Lightning時代のService Cloud概要とカスタマイズSalesforce Developers Japan
 
Spring '19リリース開発者向け新機能セミナー
Spring '19リリース開発者向け新機能セミナーSpring '19リリース開発者向け新機能セミナー
Spring '19リリース開発者向け新機能セミナーSalesforce Developers Japan
 
業務課題の解決に、データ分析・予測結果の活用を - Einstein Discovery / Einstein 予測ビルダーのご紹介 -
業務課題の解決に、データ分析・予測結果の活用を - Einstein Discovery / Einstein 予測ビルダーのご紹介 -業務課題の解決に、データ分析・予測結果の活用を - Einstein Discovery / Einstein 予測ビルダーのご紹介 -
業務課題の解決に、データ分析・予測結果の活用を - Einstein Discovery / Einstein 予測ビルダーのご紹介 -Salesforce Developers Japan
 
MuleSoft Anypoint Platformのコンセプトとサービス
MuleSoft Anypoint PlatformのコンセプトとサービスMuleSoft Anypoint Platformのコンセプトとサービス
MuleSoft Anypoint PlatformのコンセプトとサービスSalesforce Developers Japan
 
IoTで成功を収めるための製品と戦略 〜 Salesforce IoT 〜
IoTで成功を収めるための製品と戦略 〜 Salesforce IoT 〜IoTで成功を収めるための製品と戦略 〜 Salesforce IoT 〜
IoTで成功を収めるための製品と戦略 〜 Salesforce IoT 〜Salesforce Developers Japan
 
Lightning時代のレポート ダッシュボード & Flow 最前線
Lightning時代のレポート ダッシュボード & Flow 最前線Lightning時代のレポート ダッシュボード & Flow 最前線
Lightning時代のレポート ダッシュボード & Flow 最前線Salesforce Developers Japan
 
Summer18 開発者向け新機能Webセミナー
Summer18 開発者向け新機能WebセミナーSummer18 開発者向け新機能Webセミナー
Summer18 開発者向け新機能WebセミナーSalesforce Developers Japan
 

Mehr von Salesforce Developers Japan (20)

Salesforce DX の始め方とパートナー様成功事例
Salesforce DX の始め方とパートナー様成功事例Salesforce DX の始め方とパートナー様成功事例
Salesforce DX の始め方とパートナー様成功事例
 
データ連携の新しいカタチ - 変更データキャプチャ/プラットフォームイベントを MuleSoft Anypoint Platform と組み合わせて試してみよう
データ連携の新しいカタチ - 変更データキャプチャ/プラットフォームイベントを MuleSoft Anypoint Platform と組み合わせて試してみようデータ連携の新しいカタチ - 変更データキャプチャ/プラットフォームイベントを MuleSoft Anypoint Platform と組み合わせて試してみよう
データ連携の新しいカタチ - 変更データキャプチャ/プラットフォームイベントを MuleSoft Anypoint Platform と組み合わせて試してみよう
 
Einstein Analyticsでのデータ取り込みと加工
Einstein Analyticsでのデータ取り込みと加工Einstein Analyticsでのデータ取り込みと加工
Einstein Analyticsでのデータ取り込みと加工
 
GMOペパボのエンジニアが語るHeroku活用ノウハウ
GMOペパボのエンジニアが語るHeroku活用ノウハウGMOペパボのエンジニアが語るHeroku活用ノウハウ
GMOペパボのエンジニアが語るHeroku活用ノウハウ
 
Salesforce Big Object 最前線
Salesforce Big Object 最前線Salesforce Big Object 最前線
Salesforce Big Object 最前線
 
Salesforce 開発者向け最新情報 Web セミナー 〜 TrailheaDX での新発表 & Summer '19 リリース新機能 〜
Salesforce 開発者向け最新情報 Web セミナー 〜 TrailheaDX での新発表 & Summer '19 リリース新機能 〜Salesforce 開発者向け最新情報 Web セミナー 〜 TrailheaDX での新発表 & Summer '19 リリース新機能 〜
Salesforce 開発者向け最新情報 Web セミナー 〜 TrailheaDX での新発表 & Summer '19 リリース新機能 〜
 
Einstein Next Best Action を試してみよう
Einstein Next Best Action を試してみようEinstein Next Best Action を試してみよう
Einstein Next Best Action を試してみよう
 
Salesforce DXとLightning Web ComponentsでモダンSalesforceアプリ開発
Salesforce DXとLightning Web ComponentsでモダンSalesforceアプリ開発Salesforce DXとLightning Web ComponentsでモダンSalesforceアプリ開発
Salesforce DXとLightning Web ComponentsでモダンSalesforceアプリ開発
 
Lightning時代のService Cloud概要とカスタマイズ
Lightning時代のService Cloud概要とカスタマイズLightning時代のService Cloud概要とカスタマイズ
Lightning時代のService Cloud概要とカスタマイズ
 
Spring '19リリース開発者向け新機能セミナー
Spring '19リリース開発者向け新機能セミナーSpring '19リリース開発者向け新機能セミナー
Spring '19リリース開発者向け新機能セミナー
 
業務課題の解決に、データ分析・予測結果の活用を - Einstein Discovery / Einstein 予測ビルダーのご紹介 -
業務課題の解決に、データ分析・予測結果の活用を - Einstein Discovery / Einstein 予測ビルダーのご紹介 -業務課題の解決に、データ分析・予測結果の活用を - Einstein Discovery / Einstein 予測ビルダーのご紹介 -
業務課題の解決に、データ分析・予測結果の活用を - Einstein Discovery / Einstein 予測ビルダーのご紹介 -
 
Einstein analyticsdashboardwebinar
Einstein analyticsdashboardwebinarEinstein analyticsdashboardwebinar
Einstein analyticsdashboardwebinar
 
MuleSoft Anypoint Platformのコンセプトとサービス
MuleSoft Anypoint PlatformのコンセプトとサービスMuleSoft Anypoint Platformのコンセプトとサービス
MuleSoft Anypoint Platformのコンセプトとサービス
 
IoTで成功を収めるための製品と戦略 〜 Salesforce IoT 〜
IoTで成功を収めるための製品と戦略 〜 Salesforce IoT 〜IoTで成功を収めるための製品と戦略 〜 Salesforce IoT 〜
IoTで成功を収めるための製品と戦略 〜 Salesforce IoT 〜
 
Heroku seminar winter19
Heroku seminar winter19Heroku seminar winter19
Heroku seminar winter19
 
Dreamforce18 update platform
Dreamforce18 update platformDreamforce18 update platform
Dreamforce18 update platform
 
Winter '19 開発者向け新機能
Winter '19 開発者向け新機能Winter '19 開発者向け新機能
Winter '19 開発者向け新機能
 
Lightning時代のレポート ダッシュボード & Flow 最前線
Lightning時代のレポート ダッシュボード & Flow 最前線Lightning時代のレポート ダッシュボード & Flow 最前線
Lightning時代のレポート ダッシュボード & Flow 最前線
 
Summer18 開発者向け新機能Webセミナー
Summer18 開発者向け新機能WebセミナーSummer18 開発者向け新機能Webセミナー
Summer18 開発者向け新機能Webセミナー
 
使ってみよう、Salesforce Big Object!
使ってみよう、Salesforce Big Object!使ってみよう、Salesforce Big Object!
使ってみよう、Salesforce Big Object!
 

Kürzlich hochgeladen

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Kürzlich hochgeladen (7)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

Force.com Weibnar : アドバンスドVisualforce

  • 1. Force.com Webinar: アドバンスド Visualforce Mitsuhiro Okamoto Program Manager Developer / Platform Marketing ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 2. Agenda 1. 前提条件 2. 厄介だけどいい友達: View State 3. View Stateの管理 4. 非同期Apex ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 4. この アドバンスド Webinar の前提条件... ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 5. この アドバンスド Webinar の前提条件... ...不明点なく、自信を持ってVisualforceが記述できる ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 6. この アドバンスド Webinar の前提条件... ...不明点なく、自信を持ってVisualforceが記述できる ...一般的なApexコードを書く事ができる ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 7. この アドバンスド Webinar の前提条件... ...不明点なく、自信を持ってVisualforceが記述できる ...一般的なApexコードを書く事ができる ...HTML & JavaScriptそしてAJAXのコンセプトを理解している ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 8. 厄介だけどいい友達: View State ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 9. Q: View Stateとは? A: Apexコントローラの状態やVisualforceページの状態をサーバ リクエスト間も保持するための、Visualforceページ内に暗号化 されたhiddenの <input> フィールドのこと。 このフィールドは <apex:form> タグがページ上にある場合のみ生成される。 ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 10. Visualforceのライフサイクル A A : URLがリクエストされる HTTP GET B : Apexコントローラがサーバ上でインス タンス化される E C : コントローラの状態がView Stateに直 HTTP POST 列化(シリアライズ)& 暗号化されて D : ページマークアップがブラウザに送信 D B され、描画される E : View Stateが復号 & 復元される (PostBack時) <input type="hidden" value="..."/> C ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 11. View State: 利点と課題 すばらしい点 :-) 課題 :-( • 自動的にフィールドの値を保持してく • 巨大化し、パフォーマンスに影響を れる 与える可能性 • 簡単なAJAX機能を持ち合わせている • サイズ制限(135k)を持っている • 非常に簡単に使えるre-renderページ • 複雑なAJAX機能に対応しづらい コンポーネントを持つ ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 12. View Stateを必要とするもの... <apex:action*> <apex:command*> <apex:inlineEditSupport> <apex:input*> <apex:select*> ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 15. どのようにView Stateを管理するか? A. コンポーネントの数を減らす ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 16. どのようにView Stateを管理するか? A. コンポーネントの数を減らす B. transient キーワードを利用する ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 17. どのようにView Stateを管理するか? A. コンポーネントの数を減らす B. transient キーワードを利用する C. JavaScript Remotingを利用する ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 18. どのようにView Stateを管理するか? A. コンポーネントの数を減らす B. transient キーワードを利用する C. JavaScript Remotingを利用する D. Streaming APIを利用する ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 20. オプション A: コンポーネント数を減らす <apex:outputPanel layout="inline"...> <apex:outputPanel layout="block"...> <apex:panelGrid...> <apex:outputLink...> <apex:outputText styleClass="..."...> ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 21. オプション A: コンポーネント数を減らす <apex:outputPanel layout="inline"...> <span...> <apex:outputPanel layout="block"...> <div...> <apex:panelGrid...> <table...> <apex:outputLink...> <a...> <apex:outputText styleClass="..."...> <span...> ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 22. オプション A: コンポーネント数を減らす <span...> <div...> <table...> <a...> <span...> ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 23. オプション B: transient キーワード public with sharing class EditClientController { public Contact client { get; set; } transient public List<Contact> connections { get; set; } transient public List<Account> previousEmployers { get; set; } transient public Set<String> hashTags { get; set; } ... } ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 24. オプション B: transient キーワードを使う BEFORE AFTER ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 25. オプション B: transient キーワードを使う BEFORE 57% AFTER ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 26. オプション C: JavaScript Remotingを使う Q: JavaScript Remotingとは? A: ステートレスにApexコントローラ内のメソッドをJavascriptか ら呼ぶ方法 ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 27. オプション C: Use JavaScript Remoting 取引先責任者を検索: ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 28. オプション C: Use JavaScript Remoting 取引先責任者を検索: <apex:actionFunction ... /> <apex:actionRegion ... /> <apex:actionSupport ... /> ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 29. オプション C: Use JavaScript Remoting 取引先責任者を検索: JavaScript Remoting ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 30. JavaScript Remoting のライフサイクル ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 31. JavaScript Remoting のライフサイクル JS Function ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 32. JavaScript Remoting のライフサイクル JS Function Apex Method ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 33. JavaScript Remoting のライフサイクル JS Function Apex Method JS Callback ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 34. JavaScript Remoting のライフサイクル JS Function Apex Method JS Callback ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 35. JavaScript Remoting のライフサイクル JS Function Apex Method クライアントサイド JS Callback サーバサイド ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 36. JS Function Apex Method JS Callback ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 37. オプション C: JavaScript Remoting: ページ <apex:page controller="FindCustomerController"> <input id="searchField" type="text" placeholder="姓を入力"/> <button onclick="handleButtonClick();">検索</button> <table> <tbody id="results"></tbody> </table> JS Function </apex:page> Apex Method JS Callback ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 38. オプション C: JavaScript Remoting: ページ <apex:page controller="FindCustomerController"> <input id="searchField" type="text" placeholder="姓を入力"/> <button onclick="handleButtonClick();">検索</button> <table> <tbody id="results"></tbody> </table> JS Function </apex:page> Apex Method JS Callback ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 39. オプション C: JavaScript Remoting: ページ <apex:page controller="FindCustomerController"> <input id="searchField" type="text" placeholder="姓を入力"/> <button onclick="handleButtonClick();">検索</button> <table> <tbody id="results"></tbody> </table> JS Function </apex:page> Apex Method JS Callback ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 40. オプション C: JavaScript Remoting: JavaScript function handleButtonClick() { var searchTerm = document.getElementById("searchField").value; FindCustomerController.doSearch(searchTerm, renderResults); } JS Function Apex Method JS Callback ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 41. オプション C: JavaScript Remoting: JavaScript function handleButtonClick() { var searchTerm = document.getElementById("searchField").value; FindCustomerController.doSearch(searchTerm, renderResults); } JS Function Apex Method JS Callback ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 42. オプション C: JavaScript Remoting: JavaScript function handleButtonClick() { var searchTerm = document.getElementById("searchField").value; FindCustomerController.doSearch(searchTerm, renderResults); } Apexクラス Apexメソッド Apexメソッドパラメータ JSコールバック関数 JS Function Apex Method JS Callback ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 43. オプション C: JavaScript Remoting: Apexクラス public with sharing class FindCustomerController { @RemoteAction public static List<Contact> doSearch(String customerLastName) { customerLastName = '%' + customerLastName + '%'; return [ SELECT id, FirstName, LastName FROM Contact WHERE LastName LIKE :customerLastName LIMIT 200 ]; JS Function } Apex Method JS Callback } ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 44. オプション C: JavaScript Remoting: Apexクラス public with sharing class FindCustomerController { @RemoteAction public static List<Contact> doSearch(String customerLastName) { customerLastName = '%' + customerLastName + '%'; return [ SELECT id, FirstName, LastName FROM Contact WHERE LastName LIKE :customerLastName LIMIT 200 ]; JS Function } Apex Method JS Callback } ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 45. オプション C: JavaScript Remoting: コールバック function renderResults(results, event) { var container = document.getElementById("results"), html = []; for (var i=0, j=results.length; i<j; i++) { html.push("<tr><td>"); html.push(results[i].LastName + ", " + results[i].FirstName); html.push("</td></tr>"); } container.innerHTML = html.join(""); JS Function } Apex Method JS Callback ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 46. オプション C: JavaScript Remoting: 結果 JS Function Apex Method JS Callback ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 47. オプション C: JavaScript Remoting: 結果 BEFORE AFTER 440ms 215ms ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 48. オプション C: JavaScript Remoting: 結果 BEFORE AFTER 440ms 215ms 52% ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 49. オプション D: Streaming APIを使う Q: Streaming APIとは? A: Salesforceインスタンスからポーリングをせずにほぼリアルタ イムに更新を効率よく取得する方法 ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 50. オプション D: Streaming APIを使う BEFORE <apex:page controller="NewAccountsController"> <apex:form> <apex:actionPoller action="{!find}" rerender="wrapper" interval="15"/> <h1>Streaming API サンプル</h1> <h2>新規取引先</h2> <apex:outputPanel id="wrapper"></apex:outputPanel> </apex:form> </apex:page> ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 51. オプション D: Streaming APIを使う AFTER <apex:page controller="NewAccountsController"> <apex:includeScript value="..."/> <!-- 4つの js ファイルを読み込み --> <h1>Streaming API サンプル</h1> <h2>新規取引先</h2> <div id="wrapper"></div> <script>... $.cometd.init(...) $.cometd.subscribe(...) ...</script> </apex:page> ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 52. オプション D: Streaming APIを使う: 手順 SOQLクエリを定義する PushTopicレコードを定義する Visualforceページに必要なJavascriptをインクルードする cometdのinit(...)およびsubscribe(...)を呼び出す (Inline JS) 何が起きるかを見る ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 54. 非同期 Apex public with sharing class SendInvoiceController{ @RemoteAction public static String requestAllInvoices(String customerId) { sendAllInvoices(customerId); return('All invoices have been requested.'); } @future private static void sendAllInvoices(String customerId) { EmailHelper.emailCustomerInvoices(customerId); } } ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar
  • 55. Q&A Mitsuhiro Okamoto Program Manager Developer / Platform Marketing ハッシュタグでShareしよう: #forcewebinarjp Join the conversation: #forcewebinar