【问题标题】:Extending a breeze js entity's property causes the changes to not be tracked扩展一个微风 js 实体的属性会导致更改不被跟踪
【发布时间】:2014-01-21 16:11:38
【问题描述】:

我正在使用 Knockout-Validation 来检查用户输入的某些字段是否有效。我正在扩展一个微风实体的属性来做到这一点。以下是我的扩展:

var employeeInitializer = function (employee) {


        employee.FirstName = ko.observable().extend({ minLength: 2, required: true });
        employee.LastName = ko.observable().extend({ minLength: 2, required: true });
        employee.TargetRate = ko.observable().extend({ min: 0, required: true });

        var validation = ko.validatedObservable({
            firstName: employee.FirstName,
            lastName: employee.LastName,
            targetRate: employee.TargetRate
        });

        employee.isValid = ko.computed(function () { return validation.isValid() });
}
manager.metadataStore.registerEntityTypeCtor("Employee", null, employeeInitializer);

现在,当我对这三个字段中的任何一个进行更改时,都不会跟踪更改。如果用户正在编辑一个员工,但决定取消他们的编辑,那么我应该能够在视图模型中调用下面的行。

self.employee.entityAspect.rejectChanges();

但是,entityAspect 没有跟踪任何更改,即使应该有。如果我从属性中删除扩展名,那么一切正常。任何想法为什么会发生这种情况?

【问题讨论】:

    标签: javascript knockout.js breeze knockout-validation


    【解决方案1】:

    我想不出对 Breeze 实体使用 KO 验证的充分理由。 Breeze 实体已经将验证合并为explained here。也可以在Brian Noyes Pluralsight course on Breeze了解。

    我对 KO 验证知之甚少,无法解释您使用 KO 验证扩展 observables 是如何破坏 Breeze 更改跟踪的。如果我不得不猜测,我猜想扩展的行为用 Breeze 一无所知的新的 observable 替换了原来的 observable。因此,对这些新可观察对象的更改不会传播到位于每个实体核心的 Breeze 后备存储;从实体的角度来看,没有任何改变。

    我并不是说这是正确的解释。我建议这是一种可能性……您可以通过比较扩展前后employee.FirstName 返回的可观察属性来验证。我猜他们不一样。

    无论是否正确,我都鼓励您放弃 KO 验证,转而使用 Breeze 原生验证。

    我们欢迎您就 KO 验证对您所做的 Breeze 验证所没有的作用提出想法。

    我有些怀疑,但我想听听你的意见。

    【讨论】:

    • 感谢您的意见。我继续使用已经存在的微风验证。
    猜你喜欢
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    相关资源
    最近更新 更多