2017-04-19 1 views
0

固定ヘッダーでsap.m.Tableを作成しようとしています。私はいくつかのaproachesを試してみましたが、そのうちの1つで何か変わったことが起きています。sap.m.Tableベースのカスタムコントロールでレンダラーを定義するときの奇妙な動作

私は(私は、これは無効なHTMLになります知っている)sap.m.Tableに基づいて新しいカスタムコントロールを作成し、(sap.m.ListBaseRerenderに基づいてsap.m.TableRendererに基づいて)レンダラを再定義tbodytfoot周りdivを置くことをしようとしましたが、 CSSを介してdivをスクロール可能にします。このコードは現在のようにスクロールできません。余分な作業が必要です。

これは新しいコントロールです:

(function() { 
    var table = sap.m.Table.extend("sap.m.FixedHeaderTable2", { 
     metadata: { 
      properties: {}, 
      aggregations: {}, 
      events: {} 
     }, 
     init : function(){ 
      if (sap.m.Table.prototype.init) { 
       sap.m.Table.prototype.init.apply(this, arguments); 
      } 
     }, 
     renderer: function (oRM, oControl) { 
      sap.ui.require("sap.ui.core.Renderer"); 
      sap.ui.require("sap.m.TableRenderer"); 
      var renderer = sap.ui.core.Renderer.extend(sap.m.TableRenderer); 

      renderer.renderListHeadAttributes = function(r, c) { 
       this.renderColumns(r, c, 'Head'); 
       r.write("<div style=\"border:10px solid green\">");// ADDED 
       r.write('<tbody'); 
       r.writeAttribute('id', c.addNavSection(c.getId('tblBody'))); 
       r.write('>'); 
      }; 

      renderer.renderListEndAttributes = function(r, c) { 
       r.write('</tbody>'); 
       c._hasFooter && this.renderColumns(r, c, 'Foot'); 
       r.write("</div>");// ADDED 
       r.write('</table>'); 
      } 

      renderer.render(oRM, oControl); 
     } 
    }); 
    return table; 
})(); 

renderListheadAttributesとrenderListEndAttributesはベースレンダラーの関数であり、それに対する唯一の変更は、「追加」コメントでマークされた行です。

私が手HTMLはこれで、あなたがthead whith空のdivとtableを見ることができ、tbodytfootHTML image

だから私は私のレンダラでtbodyタグを変更しようとしました(行は「修正」でマークされた)に何が起こるかを参照してください。今

renderer.renderListHeadAttributes = function(r, c) { 
    this.renderColumns(r, c, 'Head'); 
    r.write("<div style=\"border:10px solid green\">");// ADDED 
    r.write('<div');// MODIFIED 
    r.writeAttribute('id', c.addNavSection(c.getId('tblBody'))); 
    r.write('>'); 
}; 

renderer.renderListEndAttributes = function(r, c) { 
    r.write('</div>');// MODIFIED 
    c._hasFooter && this.renderColumns(r, c, 'Foot'); 
    r.write("</div>");// ADDED 
    r.write('</table>'); 
}; 

divは、内部の空divが、tableまだtheadがあり、tbodyありnd tfoot子供として。 HTML image

また、border-image: none;がどこからも出現しています。これとレンダリングが意図したとおりに動作していないという事実は、DOMを変更するポストレンダリングのいくつかの種類が起こっていると私に思います。私が知る限り、これが起きる場所はonAfterRenderingですが、そこにはないようです(addEventDelegateと空の関数を使ってonAfterRenderingを削除します)。

ここで、なぜこの「ポストレンダリング」が起こっていますか?


私はこれを行うには良い方法があることは承知している、と私は別のscrool内部スクロールが悪い(とモバイルデバイドで悪化)であることを知っています。私はすでに実用的なソリューションを持っています。

この質問は、固定ヘッダーでスクロールを達成する方法ではなく、なぜこの奇妙な動作が起こっているのかについてです。

答えて

0

この動作は、無効なHTML(table内部div)によるブラウザによって引き起こされることがSAPUI5レンダリングプロセスとは何の関係もありませんので...それはここに指定されている:http://w3c.github.io/html/syntax.html#foster-parentingAlohci answer)。

詳細については、次の質問をご覧ください。 Browser changing incorrect HTML by itself. Where is stated that behaviour? Is there a way to avoid it?

関連する問題