Добавить данные в конец ko.observablearray
Я пытаюсь добавить данные в конец наблюдаемого массива, но он не работает должным образом. Могу поспорить, что это что-то незначительное, но я просто не могу обдумать это.
Что я делаю:
self.businesses = ko.observableArray();
function Business(business) {
var self = this;
self.BusinessID = ko.observable(business.BusinessID );
self.Type = ko.observable(business.Type);
self.Location = ko.observable(business.Location);
}
/*ajax get array of businesses as follows:
[
{
"$id": "1",
"BusinessID ": 62,
"Type": "Data",
"Location": "Data"
},
{
"$id": "2",
"BusinessID ": 63,
"Type": "Data",
"Location": "Data"
},
{
"$id": "3",
"BusinessID ": 64,
"Type": "Data",
"Location": "Data",
} ]
*/
var mappedBusinesses = $.map(data, function (business) { return new Business(business) });
self.businesses(mappedBusinesses);
Это все работает, как ожидалось, и obersablearray заполняется.
Однако, если я пойду, чтобы добавить другой бизнес, это не будет работать. Например, если я вызываю ajax, который возвращает это (как newBusiness):
{
"$id": "1",
"BusinessID ": 68,
"Type": "Data",
"Location": "Data"
}
и я делаю:
self.businesses().push(newBusiness);
Это добавляет к массиву как "Объект", а не Бизнес. Поэтому я подумал, что сделаю:
var bus = $.map(newBusiness, function (business) { return new Business(business) });
self.businesses().push(bus);
Но я получаю сообщение об ошибке в консоли JS "Uncaught TypeError: Не удается прочитать свойство 'BusinessID' с нулевым значением
Поэтому я сделал новую переменную и добавил скобки: [] в, и она добавляет к наблюдаемому массиву, но не как объект "Бизнес", а скорее как объект "Массив [1]" в конце, и это не работает как по остальным. Код следующим образом:
var newBus = {
BusinessID: newBusiness.BusinessID,
Type: newBusiness.Type,
Location: newBusiness.Location
}
var bus = $.map(newBus, function (business) { return new Business(business) });
self.businesses().push(bus);
Как упомянуто, это добавляет к наблюдаемому массиву, но фактически не добавляет как "бизнес" объект, а скорее как "массив [1]" объект.
Бьюсь об заклад, это что-то такое простое, но просто не могу заставить его работать!
2 ответа
Я знал, что это будет просто!
Он отправлял весь массив в ObservableArray... а не только объект.
Исправление:
self.businesses.push(newBusiness[0])
Пришлось добавить [0], чтобы заставить его выталкивать фактические данные в массив, а не объект!
Спасибо за ответы!
Вы оцениваете массив своим нажатием:
self.businesses().push(newBusiness);
Наблюдаемые массивы имеют свои собственные функции массива, вы должны просто сделать это (без паренов):
self.businesses.push(newBusiness);
Смотрите эту страницу: http://knockoutjs.com/documentation/observableArrays.html