Я уже давно использовал 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"}
Вы можете принять ваш собственный ответ и закрыть этот вопрос. Вы не получаете от него никакой репутации, но у других больше не будет соблазна написать ответ. :) – bikeshedder
Да, сделаю. Требуется 2 дня ожидания. –