2013-02-02 3 views
1

Я уже давно использовал knockout.js и не сталкивался с этой проблемой раньше. Обычно, когда я пытаюсь нажать на новый JS объекта в observableArray, она работает без проблем, но по какой-то причине, в этот раз я получаю эту ошибку:knockout.js observableArray не распознается как функция

TypeError: self.Students.push is not a function 

Вот фрагмент моего кода :

window.ApiClient = { 
    ServiceUrl: "/api/students", 

    Start: function() { 
     var viewModel = ApiClient.ViewModel(ngon.ClientViewModel); 
     ko.applyBindings(viewModel);     
     viewModel.get(); 
    }  
}; 

ApiClient.ViewModel = function(data) { 
    var self = this; 
    ko.mapping.fromJS(data, {}, this);  

    this.get = function (id) { 
     if (id == undefined) { 
      return ApiClient.Service.get(self.PageSize(), self.PageNumber(), function (data) { 
       self.Students(data); 
      }); 
     } 
    } 

    this.post = function() {   
     return ApiClient.Service.post(self.DetailedStudent, function (data) {       
      self.Students.push(data); 
     }); 
    } 

    return this; 
} 

ApiClient.Service = function() {  
    var _get = function (pageSize, pageNumber, callback) { 
     sv.shouldShowLoading = false; 
     var queryParams = String.format("?pageSize={0}&pageNumber={1}", pageSize, pageNumber);   
     $.ajax(ApiClient.ServiceUrl + queryParams, { 
      dataType: "json", 
      type: "get", 
      success: callback 
     }); 
    } 

    var _post = function (student, callback) { 
     $.ajax(ApiClient.ServiceUrl, { 
      data: ko.mapping.toJSON(student), 
      type: "post", 
      contentType: "application/json; charset-utf-8", 
      statusCode: { 
       201 /*Created*/: callback, 
       400 /*BadRequest*/: function (jqxhr) { 
        var validationResult = $.parseJSON(jqxhr.responseText); 
        alert(jqxhr.responseText); 
       } 
      } 
     }); 
    } 

    return {   
     get: _get, 
     post: _post 
    }; 
}(); 

$(document).ready(function() {  
    ApiClient.Start();  
}); 

Мой объект-ученик - очень простой объект C#, имеющий Id, FirstName, LastName. Функция get() работает без каких-либо проблем, это просто функция обратного вызова из post(), которая не может вытолкнуть полученные данные. Кроме того, данные, возвращаемые с сервера, выглядят правильно:

{"Id":"rea","FirstName":"asdf","MiddleName":null,"LastName":"rrr"} 

ответ

3

Я решил это! Это связано с тем, что исходный viewModel, когда экземпляр объекта модели представления страницы имеет значение «null» для свойства Students.

knockout.js требует непустых значений для всех полей, которые должны быть автоматически сопоставлены.

+0

Вы можете принять ваш собственный ответ и закрыть этот вопрос. Вы не получаете от него никакой репутации, но у других больше не будет соблазна написать ответ. :) – bikeshedder

+0

Да, сделаю. Требуется 2 дня ожидания. –

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