【问题标题】:Knockout.JS validation and computing off only validated fieldsKnockout.JS 验证和仅计算验证字段
【发布时间】:2013-01-12 12:20:31
【问题描述】:

我开始使用 Knockout.JS,我正在尝试计算我的视图模型中有效字段的“点”总和,但不知道如何去做。这个想法是,随着表格的填写,我可以根据每个已验证字段包含的点的完整值显示一个智能进度条。

如何设置 dynamicpoints 以始终包含字段的实时总和?

视图模型的简要 sn-p:

myViewModel = ko.validatedObservable({
 fields: {
  firstname: {
        label: "First Name",
        value: ko.observable("").extend({
              required: true
            }),
        points: 100
  },
  lastname: {
        label: "LastName",
        value: ko.observable("").extend({
              required: true, 
              minLength: 2
            }),
        points: 200
  }
 }
 dynamicpoints: ko.computed { ??? }
})

【问题讨论】:

    标签: knockout.js knockout-validation


    【解决方案1】:

    knockout-validation 使用 ko.computed 'isValid' 扩展可验证的 observables。

    因此你可以像这样解决这个问题:

    var dynamicpoints = ko.computed(function(){
        var totalPoints = 0;
    
        if(!myViewModel.fields.firstname.value.isValid())
            totalPoints += field.points;
    
        if(!myViewModel.fields.lastname.value.isValid())
            totalPoints += field.points;
    
        return totalPoints;
    };
    

    【讨论】:

    • 谢谢 - isValid() 是我想要的。
    【解决方案2】:

    试试这个:

    myViewModel = ko.validatedObservable({
        fields: {
            firstname: {
                label: "First Name",
                value: ko.observable("").extend({
                      required: true
                    }),
                points: 100
            },
            lastname: {
                label: "LastName",
                value: ko.observable("").extend({
                      required: true, 
                      minLength: 2
                    }),
                points: 200
            }
        },
        dynamicpoints: ko.computed(function(){
            var totalPoints = 0;
    
            if(!myViewModel.fields.firstname.value.error)
                totalPoints += field.points;
    
            if(!myViewModel.fields.lastname.value.error)
                totalPoints += field.points;
    
            return totalPoints;
        }
    });
    

    【讨论】:

    • 这将无法正常工作。问题是“错误”不是 ko.subscribable (既不可观察也不计算)。因此,knout 无法检测到其值的变化,并且计算出的值不会被更新。
    • 很公平。抱歉,我忽略了这一点。
    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多