如何在自己的验证扩展器中调用可观察的属性?

时间:2015-01-30 00:58:12

标签: javascript knockout.js knockout-validation

我正在尝试使用ASP MVC4中的淘汰框架创建一个下拉列表。验证要求相当简单 - 必须在验证控件之前选择一个国家/地区。视图模型中的相关代码如下:

function viewModel(model) {
    var _self = this;

    // Various guff
    _self.ConfirmationOption = ko.observable(model.ConfirmationOption).extend({ required: { message: _self.mdata.requiredMessage } }); //mdata is part of the guff

    _self.CountryOfPractice = ko.observable(model.CountryOfPractice).extend({
        required: {
            message: "You must select a country",
            onlyIf: function () { return (_self.ConfirmationOption() === '4' && (_self.CountryOfPractice() === null || _self.CountryOfPractice() === undefined)); }
        }
    });

    // Assorted other guff
}

当我尝试运行时,Firebug告诉我,尝试解析时出现错误,显示:

  

TypeError:_self.CountryOfPractice()不是函数。

我对敲除的有限理解是声明为ko.observable的属性不是严格的JS属性,必须作为函数访问才能获得它们的当前值。在大多数其他代码区域,这通常可以正常工作。我尝试访问验证器扩展中的值的原因是为了确保已经进行了选择。

我可以在调试器中看到CountryOfPractice还不是_self的一部分,所以我可以看到错误是如何发生的。我尝试将测试分解为另一个事先声明的函数,但该函数失败了因为它还没有看到CountryOfPractice(),如果我把它放在这个方法之后就失败了因为CountryOfPractice()的扩展器没有但看到了我的验证方法......

我需要使用哪种模式才能使功能正常工作?

1 个答案:

答案 0 :(得分:0)

解决方案是在新行上调用extend函数 - 任何人都可以解释原因吗?

_self.CountryOfPractice = ko.observable(model.CountryOfPractice);

_self.CountryOfPractice.extend({
    required: {
        message: "You must select a country",
        onlyIf: function () { return (_self.ConfirmationOption() === '4' && (_self.CountryOfPractice() === null || _self.CountryOfPractice() === undefined)); }
    }