нокаут, как подписаться на дочернюю модель просмотра

Я новичок в нокауте. У меня есть 2 ViewModels

Первый имеет 2 адреса, домашний и почтовый.

var EntityViewModel = function (clientId, taxYear) {
    var self = this;
    self.id = ko.observable(null);

    self.name = ko.observable('').extend({
        required: { message: ' Name is required' },
        validation: { validator: maxLength, message: ' Name must be less than 65 characters', params: 65 }
    });
    self.homeAddress = new AddressViewModel();
    self.mailingAddress = new AddressViewModel();
};

2-й - модель представления адреса. Что я пытаюсь сделать, так это то, что если состояние равно -1, то раскрывающийся список страны включен, если состояние > 0, то раскрывающийся список страны отключен, а для идентификатора страны установлено значение 1, что соответствует Соединенным Штатам. но проблема в том, что каждый раз, когда я меняю состояние, и домашняя страна, и страна отправки включаются или отключаются. как мне это исправить?

var AddressViewModel = function () {
    var self = this;

    self.address1 = ko.observable('');
    self.address2 = ko.observable('');
    self.city = ko.observable('');
    self.zipCode = ko.observable('');

    self.stateId = ko.observable(null);
    self.countryId = ko.observable(null);

    self.enableState = ko.observable(false);
    self.enableCountry = ko.observable(false);

    self.stateId.subscribe(function (newValue) {
        if (newValue <= 0) {
            self.enableState(true);
            self.countryId(null);

        } else {
            self.enableCountry(false);
            self.countryId(1);
        }
    });
};

Кстати, у меня также есть флажок другого почтового адреса, если этот флажок не установлен, то весь почтовый адрес отключен. если флажок установлен, то вы можете редактировать.

Я загружаю свой код на jsFiddler, пожалуйста, помогите мне его исправить.

http://jsfiddle.net/lm2000/2ZEka/22/


person qinking126    schedule 19.10.2012    source источник


Ответы (1)


Это нормально ? http://jsfiddle.net/zUYGF/1/

В основном я только что исправил вашу функцию подписки, если я правильно понял, что вы хотите:

self.stateId = ko.observable(null);
self.countryId = ko.observable(null);
self.enableCountry = ko.observable(true);

self.stateId.subscribe(function (newValue) {
    if (newValue <= 0) {
        self.countryId(null);
        self.enableCountry(true);
    } else {
        self.countryId(1);
        self.enableCountry(false);
    }
});    

Я сделал это только для первого адреса. Для второго вы должны использовать именованный шаблон, а не повторять код, я думаю (ваша AddressViewModel может иметь глобальный атрибут «enabled»).

person Gnurfos    schedule 02.11.2012