Javascript 在分步向导中重置淘汰验证中的错误

Javascript 在分步向导中重置淘汰验证中的错误,javascript,validation,knockout.js,Javascript,Validation,Knockout.js,我已经使用knockout和模板绑定创建了一个分步向导,现在我想强制用户在进入下一页之前完成每个页面,完成这个向导意味着knockout验证必须是有效的。 当viewmodel上没有错误时,“下一步”按钮将启用,并且在单步执行向导时工作正常,但当您进入一个步骤并按“上一步”时,问题就会出现。即使您返回,错误仍保持“活动”,因此第1页上的“下一步”按钮被禁用,因为第2页无效 我摆好了小提琴: 在名字框里写些东西 按下一步 按上一步 现在您可以看到“下一步”按钮已禁用 假设问题出现在下面的代码中:

我已经使用knockout和模板绑定创建了一个分步向导,现在我想强制用户在进入下一页之前完成每个页面,完成这个向导意味着knockout验证必须是有效的。 当viewmodel上没有错误时,“下一步”按钮将启用,并且在单步执行向导时工作正常,但当您进入一个步骤并按“上一步”时,问题就会出现。即使您返回,错误仍保持“活动”,因此第1页上的“下一步”按钮被禁用,因为第2页无效

我摆好了小提琴:

  • 在名字框里写些东西
  • 按下一步
  • 按上一步
  • 现在您可以看到“下一步”按钮已禁用 假设问题出现在下面的代码中:

        self.errors = ko.validation.group(self.viewModel);
    
        self.PrevIsEnabled = ko.observable(false);
        self.NextIsEnabled = ko.computed(function() {
            return self.errors().length == 0 && self.SelectedTemplate() != "Age";
        });
    

    是否有任何方法可以在返回时重置错误计数并强制淘汰验证以重新验证当前模板?

    self。错误包含所有字段的错误

    您应该只检查当前模板字段的有效性:

    self.NextIsEnabled = ko.computed(function() {
        var selectedTemplate = self.SelectedTemplate();
        return selectedTemplate != "Age" 
               && self.viewModel[selectedTemplate].isValid();
    }
    
    当然,如果模板中有多个字段,则应检查所有字段的有效性。

    我偶然发现, 所以我所要做的就是订阅
    SelectedTemplate
    并拨打电话

    self.errors.clearAllErrors();
    
    它是有效的


    我无法让更新后的JSFIDLE正常工作,因为我无法实现新功能,但这里是所有这些的基础

    我知道您在那里做了什么,但是如果这是一个更复杂的向导,每个步骤有5个步骤和10个不同的字段,我不想自己硬编码每一项检查。是否有任何方法可以循环浏览模板中绑定到可观察对象的所有字段?您可以为每个模板创建一个单独的viewmodel,并对其进行组验证,所有这些都包含在一个父viewmodel中。没有其他方法吗?我想,从长远来看,为每个步骤创建一个视图模型实际上是最有意义的…?没有其他人提供建议吗?如果我有5个步骤和5个supsteps,那将是25个viewmodels,并且在一段时间后很难维护