2014-01-07 1 views
0

другой вопрос для нокаута.Knockout создать массив in viewmodel

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

I Создайте модель с использованием плагина отображения и добавьте множество функций.

 var jsonModel = '@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(this.Model, new Newtonsoft.Json.Converters.IsoDateTimeConverter()))'; 
     myViewModel = ko.mapping.fromJSON(jsonModel, {}, new ViewModel()); 
     ko.applyBindings(myViewModel); 

Я осуществил сначала вычисляемое наблюдение. Но это дало ошибку, потому что «requestData» не инициализируется. Поэтому обновленный вариант с «если (TypeOf self.requestData =!„не определено“)»

function ViewModel() { 
var self = this; 
//---- Return PageNumbers 
self.Paging = ko.computed(function() { 
    if (typeof self.requestData != 'undefined') { 
     if (self.requestData.settings.pageNumber() <= 5) { 
      return ko.utils.range(1, 11); 
     } 
     if (self.requestData.settings.pageNumber() + 5 > self.requestData.settings.nbrOfPages()) { 
      return ko.utils.range(self.requestData.settings.nbrOfPages() - 11, self.requestData.settings.nbrOfPages()); 
     } 
     return ko.utils.range(self.requestData.settings.pageNumber() - 5, self.requestData.settings.pageNumber() + 5); 
    }; 
    return ko.utils.range(1, 11); 
}); 

массив должен быть обновлен, когда я сделать вызов к ajaxrequest:

self.changePage = function(pageNumber) { 
    self.Paging = ko.utils.range(pageNumber -1 > 0 ?) 
    myViewModel.requestData.settings.pageNumber = pageNumber; 
    $.ajax({ 
     type: "post", 
     contentType: "application/json", 
     url: "../Refund/FilterPageSortingChange", 
     data: ko.toJSON(self.requestData), 
     error: function (xhr, status, error) { 
      baseShowError("Server Error", "Error changing page"); 
     }, 
     success: function (response) { 
      var receivedResponse = JSON.parse(response); 
      if (receivedResponse.Success) { 
       ko.mapping.fromJS(receivedResponse.Result, {}, self); 
      } else { 
       baseShowError("Page not found", receivedResponse.message); 
      } 
     } 
    }); 
}; 

Что должен я делаю для обновления массива поискового вызова при получении новых данных?

Виды считает

UPDATE: Помимо моего кода, Что лучший/самый простой вариант, чтобы создать наблюдаемый массив Thats depandant из PageNumber?

ответ

1

Ваш PageNumber является наблюдаемым, но когда вы назначаете его, как это:

myViewModel.requestData.settings.pageNumber = pageNumber; 

вы стерли наблюдаемые и заменить его простым значение. Вы должны назначить его следующим образом:

myViewModel.requestData.settings.pageNumber(pageNumber); 
+0

Хороший момент (извините за ошибку начинающих), но тем не менее self.Page вычислено в зависимости от 2 наблюдаемых. Но после обновления этих наблюдаемых self.Page не запускается для обновления. –

+0

Остальная часть того, что у вас есть, выглядит нормально, но, вероятно, что-то я пропустил. Можете ли вы опубликовать jsfiddle, и я помогу ему работать –