У меня есть страница со столом, связанная с нокаутом внутри UpdatePanel. Моя цель - получить привязку, успешно примененную после обратной передачи. Все работает так, как ожидалось, при начальной загрузке страницы, поэтому модель работает.Перехват нокаутом после обратной передачи в UpdatePanel
Я использую функцию pageLoad() для вызова функции, которая получает данные JSON модели с HiddenField, который был настроен на стороне сервера. В представлении у меня есть каждый привязку привязки данных RadioButton к функции JS за пределами ViewModel, которая устанавливает значение скрытого поля ввода в идентификатор, заданный кнопкой, а затем вызывает обратную передачу сервера, нажав на скрытую кнопку на стороне клиента.
Внутри страницыLoad() Я использую Sys.WebForms.PageRequestManager.getInstance(). Add_endRequest, чтобы указать, что вспомогательная функция привязки должна вызываться после завершения серверной части обратной передачи.
Мои проблемы:
После того, как установлен на стороне сервера, скрытое с данными JSON еще имеет ту же строку, как это делали на стороне клиента, когда он возвращается к клиенту, несмотря на то, когда на стороне сервера скриптлет , я вижу, что значение обновлено правильно. Не уверен, что здесь происходит.
Даже если значения не обновляются, вызывается BindingHelper(), хотя по какой-либо причине нажатие на RadioButtons больше не вызывает событие после того, как один обратный вызов уже произошел.
Любое понимание этого было бы высоко оценено!
Код:
<script type="text/javascript">
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(BindingHelper)
function pageLoad() {
if (!isPostBack()){
BindingHelper();
}
}
function BindingHelper() {
var data = <%= hfData.Value%>;
var model = new DataViewModel();
model.load(data);
ko.applyBindings(model);
}
function Select(id) {
document.getElementById('<%=hfSelectedID.ClientID%>').value = id;
document.getElementById('<%=rbSelect.ClientID%>').click();
}
function isPostBack() {
return document.getElementById('hfPostback').value == 'True';
}
</script>
HTML:
<table id="tblData">
<thead>
<tr>
<th></th>
<!-- ko foreach: subViewModel -->
<th><input type="radio" name="rbGroup" data-bind="value: id, checked: $root.selectedID, click: function() {Select(id);}" /><span data-bind="text: name"></span></th>
<!-- /ko -->
</tr>
</thead>
</table>
<asp:HiddenField ID="hfData" runat="server" />
<asp:HiddenField ID="hfSelectedID" runat="server" />
<input id="hfPostback" type="hidden" value="<%=Page.IsPostBack.ToString()%>" />
<div style="display:none">
<asp:RadioButton ID="rbSelect" runat ="server" AutoPostBack="true" />
</div>
Edit: Я так решил, что это работает, если привязка не внутри UpdatePanel, просто зарегистрировав BindingHelper() в качестве стартапа скрипт в Page_Load.
Как ни странно, даже если я зарегистрирую скрипт запуска, указав UpdatePanel, результаты будут одинаковыми. В UpdatePanel есть другие элементы управления, поэтому я знаю, что UpdatePanel на самом деле обновляется, и он не установлен для условного обновления.
Я также пробовал вызывать BindingHelper, когда это также обратная передача, но это заставляет переплетаться и показывает слишком много строк в таблице. С (! Ko.dataFor (document.getElementById ('tblBenefits')) проверьте, я вижу, что при обратной передаче привязки все еще существуют, и все же, если я включаю это как условие, это никогда не связано с обратной передачей , – barthooper