afterRenderイベントのAJAX呼び出しによってトリガーされたKnockoutテンプレートによって作成された要素へのバインドに問題があります。このフィドルでわかるように、結果は適切にレンダリングされますが、afterRenderイベントハンドラーでは要素はまだ使用できません。
質問...
afterRenderイベントハンドラーの実行時にテンプレートがレンダリングされていないように見えるため、テンプレートはどのように適切にレンダリングされますか?
AJAX呼び出しが結果に影響するのはなぜですか?AJAX呼び出しの上の行のコメントを外すと、テンプレート要素はafterRenderイベントで使用できます。
これがコードです...
HTML
<div id="plugin" data-bind="template: { name: 'fooTemplate', data: $data, afterRender: postProcess }"></div>
<br />
<br />
<hr />
<div id="results"></div>
<script type="text/html" id="fooTemplate">
<div data-bind="foreach: items()">
<span data-bind="text: displayText"></span>
</div>
</script>
JAVASCRIPT
var data = {
items: [{
displayText: 'Name',
}, {
displayText: 'Last Login Date',
}, {
displayText: 'Email',
}]
};
function DataModel() {
var self = this;
self.items = ko.observableArray([]);
self.data = ko.dependentObservable(function () {
//self.items(data.items);// <<== UNCOMMENT THIS LINE AND THE postProcess FUNCTION SHOWS FULLY RENDERED DOM
$.ajax({
url: '/some/path',
error: function () {
self.items(data.items);
}
});
});
postProcess = function () {
$('#results').text($('#plugin').html());
}
}
dataModel = new DataModel();
ko.applyBindings(dataModel);
1つの注意...フィドルは偽のアドレスにAJAX呼び出しを行います。これは、Fiddleにサーバーの依存関係がないためです。errorプロパティを利用して、テンプレートを実行するデータを変更します。ただし、私の開発環境では、有効なURLを呼び出すと、フィドルに表示されるのと同じ結果が得られます。また、サーバーから返されたデータを使用してテンプレートをロードしていません。むしろ、フィドルは上部に静的に定義されたデータソースを使用します(これも問題をデモするためです)。