【问题标题】:knockout, how to subscribe child viewModel淘汰赛,如何订阅子viewModel
【发布时间】:2012-10-09 14:58:36
【问题描述】:

我是 Knockout 的新手。我有 2 个视图模型

第一个有 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,则禁用 country 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/

【问题讨论】:

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


    【解决方案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 可能具有全局“启用”属性)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-20
      • 2016-02-29
      • 2012-05-26
      • 2015-01-04
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多