нокаут: вложенный зависимый наблюдатель - не работает - PullRequest
0 голосов
/ 21 октября 2011

Я новичок в нокауте JS.Мне нужно связать вложенные массивы как следующие:

Имя: Выпадающее

Электронная почта: Имя выбранного пользователя

Тип метода контакта: Раскрывающийся с выбранным типом метода контакта из ContactInfo

Значение контакта: Фактическое значение из ContactInfo

У меня есть Имя, адрес электронной почты и значение контактаза работой.Мне нужно знать, как выбрать значение типа метода контакта в раскрывающемся списке, и то же самое необходимо связать со значением контакта.

Я получаю следующую ошибку Ошибка: невозможно получить значение свойства'ContactMethodType': объект является нулевым или неопределенным

function LifelineViewModel() {

    this.lifelines = ko.observableArray([{
        Name: "",
        Email: "",
        ContactInfo:
                {
                    ContactMethodType: "",
                    ContactValue: ""
                }
    }]);
    this.selectedLifeline = ko.observable();

    this.contactTypes = ko.observableArray([{Name: ''}]);

    this.selectedContactInfo = ko.dependentObservable(function () {
        if (this.selectedLifeline() === undefined) return null;
        return this.selectedLifeline().ContactInfo;
    }, this);

    this.selectedContactMethodType = ko.dependentObservable(function () {
        if (this.selectedContactInfo() === undefined) return null;
        return this.selectedContactInfo().ContactMethodType;
    }, this);

}

HTML-код

<select data-bind="options: lifelines, optionsText: 'Name', value: selectedLifeline"></select>
<p><span data-bind="text: selectedLifeline().Email"></span></p>
<p><span data-bind="text: selectedContactInfo().ContactMethodType + ' ' + selectedContactInfo().ContactValue"></p>
<select data-bind="options: contactTypes, optionsText: 'Name', value: selectedContactMethodType"></select>

1 Ответ

3 голосов
/ 21 октября 2011

Ваша проблема заключается во втором зависимом наблюдении. По умолчанию зависимые объекты наблюдаются впервые при их создании. В вашем случае selectedContactMethodType получит текущее значение от selectedContactInfo, которое будет null. Это не будет соответствовать вашей проверке undefined, а затем попытаться прочитать ContactMethodType из null, что вызывает ошибку.

Итак, вам нужно быть немного более осторожным в том, как вы относитесь к неопределенному и нулевому.

Используя привязки потока управления в 1.3 бета , здесь приведен пример без использования зависимых наблюдений для защиты от нуля: http://jsfiddle.net/rniemeyer/9msqK/

...