1

ListView に設定されている ItemTemplate があります。

<div class="commentTileTemplate" data-win-control="WinJS.Binding.Template">
    <div class="commentTileControl" data-win-control="WinJS.UI.HtmlControl" data-win-options="{uri: '/htmlControls/commentTile/commentTile.html'}"></div>
</div>

HtmlControl 内にあるデータ バインディングは、ListView が初めて表示されたときにバインドに失敗し、連続して実行すると正常に動作します。

ListView からテンプレートを削除すると、生データが期待どおりに表示されますが、HtmlControl を追加したときにのみ最初に失敗します。

何が間違っているのでしょうか?

4

1 に答える 1

2

これは、コントロールを初めて読み込むときにWinJS.xhr、パッケージから XHR ( ) を介してページが非同期に読み込まれるためです。これはWinJS.Binding.process()、関数で最初に発生したときWinJS.Binding.Template.renderに、実際のコンテンツが読み込まれないことを意味します。data-win-bind(たとえば、クエリ セレクターには属性が表示されません。

2 回目は、ロードしているフラグメントがすでにフラグメント キャッシュにあるため、実際には同期的にDOM にレンダリングされ、はそれらのWinJS.Binding.Template.render属性を認識します。WinJS.Binding.processAlldata-win-bind

これにより、いくつかのオプションが残ります。

  1. WinJS.UI.Fragments.cache()アプリが起動したらすぐにフラグメントをプリロードし、そのフラグメントが完了するまでリストビューにデータを設定しないでください
  2. HtmlControlアイテムがレンダリングされたときにのみ をインスタンス化し、ロード時にロードされたテンプレートをプログラムでインスタンス化します [1 HtmlControl]WinJS.Binding.process[All]()
  3. 実際にテンプレートをコンテンツにしてから、フラグメントをロードし、コントロールを処理します。これは見た目よりも簡単ですが、考えるのに時間がかかるかもしれません。data-win-controlつまり、Fragment をロードし、それを持っている要素のフラグメントに querySelector をロードしWinJS.UI.process()、テンプレート インスタンスを呼び出し元に返し、それをリスト ビューの itemTemplate として使用します。

[1] HtmlControl コンストラクターは 3 番目のパラメーターを受け取ります。これは、フラグメントが読み込まれたときに呼び出されるコールバックです。

于 2012-09-02T22:48:47.353 に答える