Добавить данные в конец 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

Другие вопросы по тегам