淘汰赛,如何订阅子视图模型

时间:2012-10-19 02:57:10

标签: knockout.js knockout-2.0 knockout-validation

我是Knockout的新手。我有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();
};

第二个是地址视图模型。我尝试做的是,如果state为-1,则启用country dropdownlist,如果state为> 0,然后国家dropdownList被禁用,countryId被设置为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/

1 个答案:

答案 0 :(得分:0)

这样好吗? 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可能具有全局“启用”属性)。