2013-12-16 2 views
0

, который сводит меня с ума ... Я проверил много сообщений, связанных с моим вопросом, но по-прежнему не могу исправить мою проблему. Одним словом: Я использую '$ .Ajax.BeginForm' для обновления моей модели наблюдаемого массива. Данные есть, таблица обновляется, но когда я проверяю длину этого массива, он остается 0! Что мне здесь не хватает?ObservableArray.length остается 0. Нокаут

здесь данные:

ViewModel:

<script type="text/javascript"> 
     //VIEW MODEL DECLARATION: 
     var ViewModel = { 
      SubscriberEmail: ko.observable(""), 
      SubscriberLists: ko.observableArray([]), 
      UnsubscribeAll: ko.observable(false), 
      UpdateSubscriberLists: function() 
      { 
       $.ajax("/Home/UpdateSubscriptionInfo/", { 
        data: ko.toJSON({ lists: this.SubscriberLists }), 
        type: "post", 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        success: function (data) 
        { 
         $().toastmessage('showNoticeToast', data); 
        } 
       }); 
      }, 
      ProcessUnsubscribeAll: function() { 
       if (this.UnsubscribeAll) 
       { 
        alert('changing'); 
        alert(ViewModel.SubscriberLists().length); 
        ko.utils.arrayForEach(ViewModel.SubscriberLists(), function (item) 
        { 
         alert("changing OptIn"); 
         //item.OptIn = false; 
        }); 
       }; 
      } 
     }; 

     //UTILITY FUNCTIONS: 
     function DisplayMessage(data) 
     { 
      $().toastmessage('showNoticeToast', data); 
     } 
     function ProcessListsReceived(data) 
     { 
      ViewModel.SubscriberLists(ko.mapping.fromJSON(data)); 
     } 

     //ON DOCUMENT LOADED: 
     $(document).ready(function() 
     { 
      ko.applyBindings(ViewModel); 
     }); 
    </script> 

Часть, которая требует обновления:

<div class="navbar-right form-inline" style="margin-top: 10px;"> 
       @using (Ajax.BeginForm("GetSubscriptionInfo", 
             new AjaxOptions 
              { 
               HttpMethod = "POST", 
               OnSuccess = "ProcessListsReceived" 
              })) 
       { 
        <div class="form-group"> 
         <span class="glyphicon glyphicon-search">&nbsp;</span> 
         <label class="sr-only" for="inputemail">Email address</label> 
         <input data-bind="text:SubscriberEmail" type="email" class="form-control input-sm" id="inputemail" name="inputemail" placeholder="Enter your email" style="width: 300px;"> 
        </div> 
        <button type="submit" class="btn btn-default input-sm btn-primary" data-loading-text="Loading...">Get my subscriptions</button> 
       } 
      </div> 

Функция, которая обновляет наблюдаемый массив, объявленный выше в разделе Javascript -

function ProcessListsReceived(data) 
      { 
       ViewModel.SubscriberLists(ko.mapping.fromJSON(data)); 
      } 

я кнопка привязана к длине массива .. он всегда остается отключен:

<button data-bind="click: UpdateSubscriberLists, enable: SubscriberLists().length > 0" type="button" class="btn btn-warning">Update subscription</button> 

SO .... почему после обновления длины массива 0? Спасибо за любые советы!

AL

ответ

0

ОК, кажется, что «ko.mapping.fromJSON» не обновляет длину моего массива в моем случае ... Переписывая дэ-код, чтобы сделать фактический толчок сделал трюк и мой массив отражает правильно количество элементов.

Таким образом, вместо:

function ProcessListsReceived(data) 
      { 
       ViewModel.SubscriberLists(ko.mapping.fromJSON(data)); 
      } 

Я объявил:

var SubscriberList = function (id,name,desc,optin) { 
      this.ListID = ko.observable(id); 
      this.ListName = ko.observable(name); 
      this.ListDescription = ko.observable(desc); 
      this.OptIn = ko.observable(optin); 
     }; 

и переписал функцию:

function ProcessListsReceived(data) { 
      $(jQuery.parseJSON(data)).each(function() 
      { 
       ViewModel.SubscriberLists.push(new SubscriberList(this.ListID, this.ListName, this.ListDescription, this.OptIn)); 
      }); 
     } 

теперь он работает. спасибо, Al

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