2017-04-30 26 views
-2

現在、ODataサービスを使用するSAP Fiori appで作業しています。関数内のグローバル変数の値を設定する

自分のコントローラからfonctというメソッドを作成して、自分のODataから来る変数を計算しました。

この値をキャプチャして、ビューをリフレッシュするたびにグローバル変数に入れたいとします。

私はこのようなグローバル変数を作成:

var boo1; 
return Controller.extend("com.controller.Detail", {...}); 

をし、私は私のonInitメソッド内で私の方法fonctにパラメータとしてboo1を渡されたが、それはundefinedです。ここで

は私のコントローラのコードの抜粋です:

sap.ui.define([ 
    "com/util/Controller" 
], function(Controller) { 
    "use strict"; 

    var boo1; 
    return Controller.extend("com.controller.Detail", { 
     onInit: function() { 
      this.fonct(boo1); 
      alert(boo1); 
     },   

     fonct: function(ovar) { 
      var that = this; 
      var oModel = that.getView().getModel(); 
      oModel.read("/alertSet", { 
       success: function(data) { 
        var a = JSON.stringify(data); 
        var b = a.slice(332,-4); 
        ovar = b; 
       } 
      }); 
     } 

    }); 
}); 
+0

'var'は、最寄りの関数スコープに結合するので、あなたの' boo1'変数は、関数のスコープではなく、グローバルスコープ –

+0

にバインドされているが、私は私のグローバル変数を宣言するとき、デバッガがいることを私に語りましたfonct関数のoModelは未定義です。 –

+0

モデルがビューに明示的に設定されていない場合は、 'this.getView()。getModel'の代わりに' this.getOwnerComponent()。getModel'を呼び出してモデルを取得してください。また、モデル名を渡すことに注意してください: 'getModel(/ * modelName * /);' – boghyon

答えて

0

あなたは(すなわち、sap.ui.define前)グローバルスコープでグローバル変数を宣言する必要があります。

+0

あなたの返答に感謝します。スコープ内にグローバル変数を宣言すると、デバッガは "oModelメソッド)は定義されていません "。 –

+0

SAPUI5およびFiori Launchpadでは、意図しない命名の衝突の危険性が高いため、そのスコープでの変数の宣言は特に危険です。 'sap.ui.define'の前に何かを定義するのは避けるべきです。 – boghyon

0

あなたがしたいことは、あなたがやっていることがより簡単だと思います。 は、グローバル変数を保存するコアオブジェクトを取得し、このオブジェクトの新しいプロパティとして変数を設定するには:

sap.ui.getCore().myGlobalVar = myCalculatedValue。その後

コアから直接プロパティを取得、他のビューでそれを使用する:

VAR mySavedVar = sap.ui.getCore().myGlobalVar

次に処理するために、ルータrouteMatchedイベントを使用あなたのナビゲーションと値をリフレッシュしてください。ここで

スニペット:https://jsbin.com/bewigusopo/edit?html,output

<!DOCTYPE html> 
<html><head> 
    <meta http-equiv='X-UA-Compatible' content='IE=edge' > 
    <meta charset="UTF-8" > 
    <title>test</title> 

    <script id='sap-ui-bootstrap' 
      src='https://sapui5.hana.ondemand.com/1.38.5/resources/sap-ui-core.js' 
     data-sap-ui-theme='sap_bluecrystal' 
     data-sap-ui-bindingSyntax="complex"></script> 

    <script id="view1" type="sapui5/xmlview"> 
     <mvc:View xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc"> 
      <core:ComponentContainer name='my.comp'/> 
     </mvc:View> 
    </script> 

    <script id="home" type="sapui5/xmlview"> 
     <mvc:View xmlns="sap.m" xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc" 
      controllerName="my.controller1"> 
      <Page> 
       <Input id="input" placeholder="Write a text to save it globally"/> 
       <Button text="Navigate to other view" press="onNavigate"/> 
      </Page> 
     </mvc:View> 
    </script> 

    <script id="add" type="sapui5/xmlview"> 
     <mvc:View xmlns="sap.m" xmlns:f="sap.ui.layout.form" xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc" 
      controllerName="my.controller2"> 
      <Page id="page" showNavButton="true" navButtonPress="onBack"> 
       <HBox class="sapUiLargeMarginBegin"> 
       <Label text="The global variable is:" class="sapUiSmallMarginEnd sapUiSmallMarginTop"/> 
       <Input id="inputResult"/> 
       </HBox> 
      </Page> 
     </mvc:View> 
    </script> 

    <script> 
     // jQuery.sap.declare("my.comp.Component"); 
     sap.ui.define("my/comp/Component", ["sap/ui/core/UIComponent"], function(UIComponent) { 
      return UIComponent.extend("my.comp.Component", { 
       metadata : { 
        name : "GreatComponent", 
        version : "1.0", 
        includes : [], 
        dependencies : { 
         libs : ["sap.m"] 
        }, 
        routing: { 
         config: { 
          routerClass: "sap.m.routing.Router", 
          viewType: "XML", 
          viewPath: "my", 
          controlId: "app", 
          transition: "slide", 
          controlAggregation: "pages" 
         }, 
         routes: [ 
          { 
           name: "home", 
           pattern: "", 
           target: "home" 
          }, 
          { 
           name: "add", 
           pattern: "add", 
           target: "add" 
          } 
         ], 
         targets: { 
          home: { 
           viewName: "Home", 
           title: "home" 
          }, 
          add: { 
           viewName: "Add", 
           title: "add" 
          } 
         } 
        } 
       }, 
       init: function() { 
        sap.ui.core.UIComponent.prototype.init.apply(this, arguments); 
        var oRouter = this.getRouter(); 
        var oViews = oRouter.getViews(); 
        this.runAsOwner(function() { 
         var myHome = sap.ui.xmlview({viewContent:jQuery('#home').html()}); 
         oViews.setView("my.Home", myHome); 
         var myAdd = sap.ui.xmlview({viewContent:jQuery('#add').html()}); 
         oViews.setView("my.Add", myAdd); 
        }); 
        oRouter.initialize(); 
       }, 
       createContent : function() { 
        var componentData = this.getComponentData(); 
        return new sap.m.App("app", { 
        }); 
       } 
      }); 
     }); 

     sap.ui.define("my/controller1", [ 
      "sap/ui/core/UIComponent" 
     ],function(UIComponent) { 
      return sap.ui.controller("my.controller1", { 
       onInit: function() { 
        this.oRouter = UIComponent.getRouterFor(this.getView()); 
       }, 

       onNavigate: function() { 
        var sInputText = this.getView().byId("input").getValue(); 
        sap.ui.getCore().myGlobalVar = sInputText;  
        console.log(sap.ui.getCore().myGlobalVar) 

        this.oRouter.navTo("add"); 
       } 
      }); 
     }); 

     sap.ui.define("my/controller2", [ 
      "sap/ui/core/UIComponent" 
     ],function(UIComponent) { 
      return sap.ui.controller("my.controller2", { 
       onInit: function() { 
        this.oRouter = UIComponent.getRouterFor(this.getView()); 

        this.oRouter.getRoute("add").attachPatternMatched(this._onObjectMatched, this); 
       }, 

       _onObjectMatched: function(){ 
        var sGlobalVariable = sap.ui.getCore().myGlobalVar; 
        console.log(sGlobalVariable); 
        this.getView().byId("inputResult").setValue(sGlobalVariable); 
       }, 

       onBack: function(){ 
        this.oRouter.navTo("home"); 
       } 
      }); 
     }); 
     sap.ui.require(["my/comp/Component"], function(myComp) { 
      // instantiate the View 
      sap.ui.xmlview({viewContent:jQuery('#view1').html()}).placeAt('content'); 
     }); 
    </script> 

</head> 
<body class='sapUiBody'> 
    <div id='content'></div> 
</body> 
</html> 

他の可能性は、あなたは非常に結合simplyfyますグローバルモデルを、設定することです。ちょうどあなたがフィオーリランチパッドに配置しようとしているアプリケーションで作業している場合、回避特に(例えばsap.ui.define前など)のグローバル変数を定義してくださいそれを作成し、コア

//To set it 
var oGlobalModel = new sap.ui.model.json.JSONModel(); 
sap.ui.getCore().setModel(oGlobalModel, "myGlobalModelID"); 

//To get it 
var oMyGlobalModel = sap.ui.getCore().getModel("myGlobalModelID"); 
0

にそれを設定します。このアプローチはconsidered harmfulです。私たちは厳格なモード("use strict")を使用してそのような実践を禁止しています。

また、sap.ui.getCore()でプロパティまたはモデルを定義することは、Fioriアプリのパターンになります。これは、グローバル変数を定義するのと同じ欠陥につながるだけでなく、コアがare not propagated to the viewsのデフォルトでに設定されているため、コンポーネントがモジュール化されているためです。したがって、そのようなデータをコアの代わりに対応するコンポーネントに定義することは、Fioriアプリケーションに行く方法です。==>FLP Best Practices


は、私はあなたががありませんでした作成したどのようなグローバル変数

var boo1; 
return Controller.extend("com.controller.Detail", {...}); 

を作成boo1以降は内部で宣言されたグローバル変数無名関数。代わりに、boo1はに格納されており、プロトタイプ方法(onInitおよびfonc)は、boo1が方法だけでなくcom.controller.Detailの他のインスタンスによってもアクセス可能になっている字句的環境を維持することができます。 Javaに関しては、boo1はプライベート静的変数であると言えます。しかし、それはグローバル変数ではありません。 (言われていること

..

は、私は私のonInitメソッド内で私の方法fonctのパラメータとしてboo1を渡されたが、それは閉鎖が不要な引数としてboo1を渡しますundefined

されていない限り、 boo1のハードコピーに複数の状態を維持したい場合)。 fonctメソッドは、fonctで定義された匿名コールバックであっても、直接boo1にアクセスできます。

boo1undefinedだった理由を今質問することがあります。 2つの理由があります。

  1. boo1fonctを呼び出す前にundefinedました。 boo1が未定義ではなくオブジェクトの場合、ovarboo1オブジェクトへの参照であり、オブジェクトではovarプロパティへの変更が行われていました。しかし、undefinedはオブジェクトではありません。だからovarboo1がまったくわからない。 注: JSの評価方法は「Call by object-sharing」です。
  2. alert(boo1)は、fonctを呼び出した直後に発生します。 oModelが同期して動作しない限り(ではなく、を使用することを強く推奨します)、ブラウザは成功コールバックが発生してからalert(boo1)を呼び出すのを待機しません。アラートはすぐに起動され、boo1を操作する必要がある成功コールバックが発生します。

ovarを削除し、代わりにboo1を使用して、成功コールバックで適切にboo1を更新します。

fonct: function(/*no ovar*/) { 
    //... 
    oModel.read("/alertSet", { 
     success: function(data) { 
      //... 
      boo1 = /*new value*/; 
      alert(boo1); 
     }.bind(this) 
    }); 
} 
関連する問題