删除验证在加载数据时停止计数错误

Knockout validation stops counting errors when data loaded

本文关键字:错误 验证 加载 数据 删除      更新时间:2023-09-26

我正在工作的形式,我使用淘汰赛+淘汰赛。验证框架。现在我被验证卡住了,因为它没有像预期的那样工作。我创建了一个简单的小提琴来告诉你我的问题。

我的viewModel是一个复杂的对象,具有可观察字段和.extend方法。验证本身工作得很好,但错误计数却不行。

在排序,如果我分配数据给我的viewModel开始像这样:

self.someObject = ko.observable(new SomeObject({
        id: "123",
        name: {
            en: "Initial data"
        }
    }));

一切正常,但是对实际数据的调用是对WebApi的一个nyc调用。因此,原始对象(viewModel.someObject)在从服务器返回时被替换。问题是,一旦对象被替换,viewModel。Errors(这是验证组)停止对错误的跟踪。

您可以在JsFiddle示例中看到完整的工作示例。也许我忽略了JS中一些重要的东西(我更喜欢c#)。

这是一个大问题,因为现在我无法停止保存数据,因为我不知道是否有任何错误。

谢谢!

错误计数不按预期工作的问题在于您自己。callForData函数。

通过

self.someObject(new SomeObject({
        id: "123",
        name: {
            en: "LoadedName"
        }
    }));

你实际上是用一个'新'对象实例替换了someObject可观察对象,因此旧的对象验证变得不被引用。

你需要一种方法来重置当前的'someObject'与新的数据值。我已经更新了小提琴,向您展示了一种方法,如何做到这一点。基本上你在你的对象中引入一个'reset'类型的函数,它重置对象的当前状态而不创建新的实例。例如:https://jsfiddle.net/newuserjs/ww2r6wet/

所以我终于找到了一个解决方案。现在看起来很容易…

@Dandy指出,当对象从ajax调用返回时,对象将被替换。这是因为ajax调用是异步的。

所以,如果你是在相同的情况下,我,你只是想做一些对象的初始加载(读取数据只一次每页加载),这是一个解决方案:你只需要确保你有javascript对象的数据之前,你调用ko。applyBindings ko。验证分组和对象构造函数,包含ko.observables。为此,您可以使用jQuery.when(..).done(..)。正如我所发现的,"done"方法中的代码将在"when"方法中的所有异步调用完成后被调用。

我想你现在已经明白我的意思了。在"when"方法中获取对象并将其保存到js变量中。在"done"方法中,从它构造新对象并调用ko。可观察的等等。applyBindings和验证分组。我创建了一个简单的代码示例,请查看。
var user;
var viewModel;
// The User model with constructor
function User(data) {
    var self = this;
    self.username = ko.observable(data.username);
    self.address = ko.observable(data.address);
    // .. other properties
}
// UserViewModel object with constructor
function UserViewModel() {
    var self = this;
    // Make the User object from 
    self.User = ko.observable(new User(user));
    // have some other help properties here in view model
    // self.tasks = ko.computed(..); // etc..
}
// The magic
$.when(
    $.getJSON("yourUrl",
        null,
        function(data) {
            user = new User(data);
        })
).done(function () {
    // This code block will run after the async getJSON finishes
    viewModel = new UserViewModel();
    viewModel.errors = ko.validation.group(viewModel, { deep: true });
    // Activates knockout.js
    ko.applyBindings(viewModel);
});