Tylko dla odniesienia i dla każdego, kto boryka się z tym problemem, z perspektywy czasu okazuje się to co najmniej dość oczywiste.
Knockout w "anonimowym" szablonie działa świetnie w wielu przypadkach, ale z JQMobile może być odrobinę dziwaczny.
To dlatego, że JQMobile dostosuje zawartość anonimowego szablonu podczas ładowania strony, tak jak ma to miejsce w przypadku wszystkich innych treści.
Później, gdy użyjesz funkcji ApplyBindings nokaut, nokaut doda odpowiednie elementy, tak jak powinien. Jak wiele napotkano na posty i odpowiedzi, MUSISZ wywołać collapsible() na nowo utworzonych elementach, przez coś takiego.
$("div[data-role='collapsible']").collapsible({refresh: true});
Nie ma problemu. Jednakże, jeśli JQM już zastosowane formatowanie, to anonimowy szablon został już „renderowane” przez JQM, tak czyniąc go ponownie wywołując składany powodując różnego rodzaju funkowych wyników, w tym dwukrotnie pozycją, zagnieżdżonych collapsibles itp
rozwiązanie dla mnie było wykorzystanie „o nazwie szablonu” funkcję nokaut, a wystarczy umieścić szablon do renderowania składane elementy w znaczniku, tak:
<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>
rozwiązanie to zapobiega JQM z „rendering” elementów szablonu, gdy strony ładują się, więc będą renderowane poprawnie, gdy zostaną wygenerowane.
EDYCJA: Powyższe działa dobrze dla collapsibles NIE w składanym zestawie, ale jeśli są w zestawie, znalazłem stylizację elementów (szczególnie zaokrąglenie narożnika, aby wskazać przynależność do zestawu) nie działa poprawnie.
Z tego co mogę powiedzieć, są 2 problemy:
Pierwszym jest to, że po prostu wyzwalanie „Utwórz” w rzeczywistości nie odświeżenie stylizacji wszystkich collapsibles w zestawie. aby to zrobić musisz ...
$("div[data-role='collapsible-set']").collapsibleset('refresh');
Ale, jest jeszcze gorszy problem. JQM "oznacza" ostatni element w zestawie jako "ostatni element". Ten fakt jest następnie wykorzystywany do określenia sposobu stylizacji ostatniego elementu podczas jego rozwijania/zwinięcia.
Ponieważ Knockout nie odbudowuje całego zestawu (dla prędkości), za każdym razem, gdy wywołuje się metodę odświeżania, JQM sumiennie zaznacza ostatni element jako "ostatni", ale nigdy nie usuwa znaków z poprzednich elementów. W rezultacie, jeśli zaczniesz od pustej listy, KAŻDY element zostanie oznaczony jako "ostatni", a stylizacja się nie powiedzie.
Mam szczegółową poprawkę dotyczącą tego na github w raporcie o problemie.
https://github.com/jquery/jquery-mobile/issues/4645
Wspaniały, zaoszczędził mi mnóstwo pracy. Dziękuję Ci! –