Knockout JS - Observable становится неопределенным при добавлении в массив

1

У меня есть объект, называемый purchase который попадает в один из двух наблюдаемых массивов в зависимости от его статуса. Объект purchase имеет наблюдаемый объект integrationStatus который я по умолчанию присвоил имени класса css для integration-status--complete

По какой-то причине покупки в массиве Scheduled кодируются зеленым цветом, как ожидалось, но покупка в массиве Unscheduled вызывает ошибку, так как integrationStatus не определен

заранее спасибо

JS Fiddle

  • 0
    Вы связываете объект viewModel для просмотра, поэтому он не должен быть someVariableNameThatHoldsPurchaceObject.integrationStatus ?
  • 0
    Привет, добро пожаловать в Stack Overflow. Пожалуйста, создайте минимальный воспроизводимый пример, чтобы другие пользователи могли воспроизвести вашу проблему. Array1 , table2 , foo, bar довольно запутаны и приведут к тому, что мы сделаем предположения о вашем коде, как @Rajesh в приведенном выше комментарии. Как вы используете привязку foreach ? Как вы «переходите» от одного массива к другому? Было бы очень легко помочь вам, если бы вы могли создать минимальную скрипку или рабочий фрагмент.
Показать ещё 1 комментарий
Теги:
knockout.js

1 ответ

2
Лучший ответ

Проблема связана с конфигурацией отображения в Schedule. Отображение вызова ko.mapping.fromJS(data, { scheduleDays: scheduleDayMapping }, self) указывает утилите только настроить отображение из scheduleDays объекта из data переменной.

Поскольку эта конфигурация не включает запись для unallocatedHolder, утилита сопоставления использует поведение наблюдаемого по умолчанию, а не пользовательское поведение. Функция UnallocatedHolder никогда не вызывается, поэтому ее массив purchases не получает настраиваемого сопоставления. Без этого сопоставления integrationStatus не определяется для этих покупок.

Я бы предложил определить новую конфигурацию отображения для Schedule следующим образом:

var scheduleMapping = {
  "scheduleDays": scheduleDayMapping,
  "unallocatedHolder": {
    create: function(options) {
      return new UnallocatedHolder(options.data);
    }
  }
};

Затем ссылайтесь на эту новую конфигурацию сопоставления в " Schedule ", обновив линию отображения до

ko.mapping.fromJS(data, scheduleMapping, self);

Пересмотренная скрипка

  • 0
    Великолепный Девон, это имеет смысл. Спасибо за помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню