2016-04-01 4 views
3

カスタムコントロールを新しいsap.ui.defineファッションに書きたいと思います。別のファイルにコントロールレンダラーを実装する際に問題があります。forbidden by SAPの間にbExport = trueを入れなければならないようです。"sap.ui.define"スタイルのSAPUI5コントロールレンダラーの作成

bExport:グローバル名への輸出が必要とされているかどうか - SAP所有のコードで使用されなければならないだけ

私は輸出ハックを利用しないレンダラの実装のいずれかの例を発見していないと私はそのような方法が存在するかどうか疑いがある。

私はいくつかの提案を持っているが、彼らは完全に私を満たしていない:

  • SAPの要求を無視し、bExport = trueを使用しています。長所:SAPコードの再利用率が高く、一般的に標準ロジックに従います。短所:公式の推奨事項を避ける。
  • my.namespace.control.GreatControlRendererを工場出荷時の機能から明示的に設定します。長所:シンプルですが、bExportに触れません。短所:モジュール設計を破ります(モジュールが実際にグローバル変数を設定するため)。

この問題を解決するには、どのような方法が最適ですか? - 実際には親クラスメソッド内 sap.ui.base.Metadata.createClass()

  • sap.ui.define(/* bExport = */ true)
    1. sap.ui.core.Control.extend():技術的には、公共利用可能なオブジェクト参照が両方において、jQuery.sap.setObject方法でフレームワークコード内に作成され


    このメソッドは、グローバルスコープ内でオブジェクトの階層を作成します。次のようにオブジェクトdot.separated.qualified.nameによりPE:

    jQuery.sap.setObject = function(sName, vValue, oContext) { 
        var oObject = oContext || window, 
         aNames = (sName || "").split("."), 
         l = aNames.length, 
         i; 
    
        if (l > 0) { 
        for (i = 0; oObject && i < l - 1; i++) { 
         if (!oObject[aNames[i]]) { 
         oObject[aNames[i]] = {}; 
         } 
         oObject = oObject[aNames[i]]; 
        } 
        oObject[aNames[l - 1]] = vValue; 
        } 
    }; 
    

    答えて

    3

    まず、あなたのレンダラはレンダリング機能を持つオブジェクトです。これは静的関数です。このレンダラーをモジュールから返します。

    sap.ui.define([], function(){ 
        var MyControlRenderer = {}; 
        MyControlRenderer.render = function(oRm, oControl){ 
        //Render your control 
        }; 
        return MyControlRenderer; 
    }); 
    

    次に、あなたのコントロールで、あなたのレンダラのオブジェクトをインポートして、このようなあなたのコントロールのレンダリングプロパティに割り当てます。この例では

    sap.ui.define([ 
    "sap/ui/core/Control", 
    "./MyControlRenderer" 
    ], function (Control, MyControlRenderer) { 
        var MyControl = Control.extend("bla.MyControl", { 
        metadata: { 
         //... 
        }, 
        renderer: MyControlRenderer 
        }); 
        return MyControl; 
    }); 
    

    レンダラは、コントロールと同じディレクトリにあります。

    +0

    私はそれが 'MyControl = Control.extend ...'でなければならないと思います。 – hirse

    +0

    それを修正しました。ありがとう! – schnoedel

    +0

    + 1ed。しかし、私は、このアプローチは現在、レンダラーがないため(UI5は存在しない* TooltipBaseRenderer *を検索しようとします)、TooltipBaseなどの他の抽象モジュールから拡張するときには機能しません。 'bExport'に戻る。 :(https://embed.plnkr.co/33zFqa/ – boghyon

    関連する問題