私は KO bindingHandler で jquery アコーディオンを使用しています。アプリの要件によって ajax を使用して、アコーディオン UI で使用される DOM を設定する必要があります。
this.faqList = ko.observableArray();
$.ajax({
url: 'getFaqs'
}).done(function( data ) {
that.faqList(data);
});
私の bindingHandler は次のように単純でなければなりません
ko.bindingHandlers.koAccordion = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
$(element).accordion(valueAccessor());
},
update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
$(element).accordion(valueAccessor());
}
};
update メソッドは observableArray (faqList) が変更されたときに呼び出されますが、その時点で UI アコーディオンは DOM 構造が既に設定されている必要がありますが、これは true ではなく、update メソッドが呼び出された後に KO が作成されるようです。DOM 構造に新しいコンテンツが取り込まれた後、更新の呼び出しを行うにはどうすればよいですか?
これがデフォルトの DOM です。
<ul class="question-list" data-bind="koAccordion: {
active: false,
autoHeight: false,
collapsible: true}">
<!-- ko foreach: faqList -->
<li>
<div class="header">
<span class="rigth-arrow"></span>
<a href="#" data-bind="text: title"></a>
</div>
<div class="content">
<h2 data-bind="text: title"></h2>
<div data-bind="text: content"></div>
</div>
</li>
<!-- /ko -->
</ul>