我无法绑定到由 afterRender 事件中的 AJAX 调用触发的 Knockout 模板创建的元素。正如您在此Fiddle中看到的,结果正确呈现,但在 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);
一个注释...小提琴对虚假地址进行了 AJAX 调用。这样 Fiddle 就没有服务器依赖项了。错误属性用于更改导致模板运行的数据。但是,在我的开发环境中调用有效的 url 会产生与小提琴中显示的结果相同的结果。另外,我没有使用从服务器返回的数据来加载模板。而是小提琴在顶部使用静态定义的数据源(再次只是为了演示问题)。