参考までに、そしてこの問題に遭遇した他の人にとっては、後から考えると少なくともある程度明白であることがわかります。
Knockoutに組み込まれている「匿名」テンプレートは多くの場合うまく機能しますが、JQMobileを使用すると、少し風変わりなものになる可能性があります。
これは、他のすべてのコンテンツと同様に、ページの読み込み時にJQMobileが匿名テンプレートのコンテンツを調整するためです。
その後、ノックアウトのApplyBindings関数を使用すると、ノックアウトは適切な要素を必要に応じて追加します。多くの投稿と回答が示唆しているように、次に、このようなものを介して、新しく作成された要素に対してcollaspible()を呼び出す必要があります。
$("div[data-role='collapsible']").collapsible({refresh: true});
問題ありません。ただし、JQMがすでにフォーマットを適用している場合、匿名テンプレートはすでにJQMによって「レンダリング」されているため、折りたたみ可能を呼び出して再度レンダリングすると、見出しの二重化、折りたたみ可能のネストなど、あらゆる種類のファンキーな結果が発生します。
私にとっての解決策は、Knockoutの「名前付きテンプレート」機能を使用し、テンプレートを配置して、次のように折りたたみ可能な要素をタグにレンダリングすることでした。
<script type="text/html" id="alarm-template">
<div data-role="collapsible" data-collapsed="true" data-collapsed-icon="arrow-d" data-expanded-icon="arrow-u" data-enhance="false">
<h3 data-bind="text:name"></h3>
<p>The content here</p>
<p data-bind="text: name"></p>
</div>
</script>
これを行うと、ページの読み込み時にJQMがテンプレート要素を「レンダリング」できないため、実際に生成されたときに適切にレンダリングされます。
編集:上記は折りたたみ可能なセットに含まれていない折りたたみ可能なものには問題なく機能しますが、セットに含まれている場合、要素のスタイル(特に、セットに属していることを示すための角の丸め)は機能しません。正しく動作します。
私の知る限り、2つの問題があります。
1つ目は、「作成」をトリガーするだけでは、セット内のすべての折りたたみ可能なスタイルのスタイルが実際には更新されないということです。それをするためにあなたはしなければなりません...
$("div[data-role='collapsible-set']").collapsibleset('refresh');
しかし、もっと悪い問題があります。JQMは、セットの最後のアイテムを「最後のアイテム」として「マーク」します。次に、その事実を使用して、最後のアイテムが展開/折りたたまれているときにスタイルを設定する方法を決定します。
Knockoutは実際にはセット全体を(速度のために)再構築しないため、refreshメソッドを呼び出すたびに、JQMは最後のアイテムを「最後」として忠実にマークしますが、前のアイテムのマークを削除することはありません。その結果、空のリストから開始すると、すべてのアイテムに「最後」のマークが付けられ、このためにスタイリングが失敗します。
githubの問題レポートでその修正について詳しく説明しました。
https://github.com/jquery/jquery-mobile/issues/4645