2014-10-22 6 views
0

У меня есть страница со столом, связанная с нокаутом внутри 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 на самом деле обновляется, и он не установлен для условного обновления.

+0

Я также пробовал вызывать BindingHelper, когда это также обратная передача, но это заставляет переплетаться и показывает слишком много строк в таблице. С (! Ko.dataFor (document.getElementById ('tblBenefits')) проверьте, я вижу, что при обратной передаче привязки все еще существуют, и все же, если я включаю это как условие, это никогда не связано с обратной передачей , – barthooper

ответ

0

Я решил это. Мне пришлось найти HiddenField в DOM, а затем разобрать JSON, чтобы получить данные для модели. Мне кажется странным, что даже после того, как значение было задано на стороне сервера, оно сохраняло старое значение, но UpdatePanel усложняет жизненный цикл.

Также я изменил RadioButton, который кликнул клиентскую сторону на LinkButton, чтобы заставить его всегда принудительно возвращать сервер обратно.

Смежные вопросы