Javascript 使用can.Map.Validate验证动态对象

Javascript 使用can.Map.Validate验证动态对象,javascript,validation,canjs,canjs-map,Javascript,Validation,Canjs,Canjs Map,我在CanJS中寻找表单验证,并了解了can.Map.Validate插件 在下面这个取自文档本身的示例中,我们需要在创建对象本身之前给出对象的属性,如“dueDate” Task = can.Map.extend({ init : function(){ this.validatePresenceOf("dueDate") } },{}); var task = new Task(), errors = task.errors() 现在我的要求是我想建立一个映射,它检

我在CanJS中寻找表单验证,并了解了can.Map.Validate插件

在下面这个取自文档本身的示例中,我们需要在创建对象本身之前给出对象的属性,如“dueDate”

Task = can.Map.extend({
  init : function(){
    this.validatePresenceOf("dueDate")
  }
},{});
var task = new Task(),
    errors = task.errors()
现在我的要求是我想建立一个映射,它检查我的字段属性是否为空,并返回一个合适的错误。但问题是,我的页面上有多个表单,formObject是动态生成的。现在,在创建对象本身之前的上述场景中,您需要在init方法中分配需要对其执行验证的属性。这不符合我的要求,因为对象正在生成,并且在创建对象之前属性未知。我在网上搜索了很多次,但都没能破解

提供代码以便更好地理解 EJS文件:login.EJS

<form id="registrationForm" name="registrationForm" method="POST">

     <input type="text" name="userName" placeholder="UserName" class="inputFieldStyle"></input>
     <input type="password" name="password" placeholder="Password" class="inputFieldStyle"></input>
     <input type="password" name="confirmPassword" placeholder="Confirm Password" class="inputFieldStyle"></input>
     <input type="email" name="email" placeholder="Email" class="inputFieldStyle"></input>
     <input type="button" name="registrationSubmit" value="Register" class="registrationLoginButton"></input>
     <input type="hidden" name="formType" value="registration"></input>
</form>

    <form id="loginForm" name="loginForm" method="POST">
        <input type="userName" name="userName" placeholder="UserName or Email" class="inputFieldStyle"></input>
        <input type="password" name="password" placeholder="Password" class="inputFieldStyle"></input>
         <input type="button" name="loginSubmit" value="Login" class="registrationLoginButton"></input>
          <input type="hidden" name="formType" value="login"></input>
    </form> 
是否有任何方法可以使用ca.Map.Validate插件验证动态对象属性? 如何访问在init方法中传递的实例对象

提前感谢:)

您需要制作、can.map(或compute)作为状态和胡须助手,以反映dom中的状态。为此,我使用sebastion proto的方法

这里是

您需要制作、can.map(或compute)作为状态和mustache助手,以反映dom中的状态。为此,我使用sebastion proto的一种方法

这里是


似乎您想要的是使用从现有对象构建的验证创建临时的、一次性的类,然后可以观察这些类是否存在错误

下面的示例显示验证是可观察的,并且随着源can.Map的变化而动态变化

can.Map("DynamicFormValidator", {
    newInstance : function(data) {
        var cls = this.extend();
        can.each(data.serialize(), function(val, key) {
            cls.validatePresenceOf(key);
        });
        //cls.prototypes.data = data;
        return can.Map.newInstance.call(cls, data);
    }
}, {
    init : function(data) {
        var that = this;
        this.attr("data", data);
        this.bind("change", function(ev, attr, how, newVal) {
            if(attr.indexOf('data.') === 0) {
                that.attr(attr.substr(5), newVal);
            }
        })
    }
    , computed_errors : can.compute(function() { return this.errors(); })
});
看看它在哪里起作用

似乎您想要的是创建临时的、一次性的类,这些类带有从现有对象构建的验证,然后可以观察到错误

下面的示例显示验证是可观察的,并且随着源can.Map的变化而动态变化

can.Map("DynamicFormValidator", {
    newInstance : function(data) {
        var cls = this.extend();
        can.each(data.serialize(), function(val, key) {
            cls.validatePresenceOf(key);
        });
        //cls.prototypes.data = data;
        return can.Map.newInstance.call(cls, data);
    }
}, {
    init : function(data) {
        var that = this;
        this.attr("data", data);
        this.bind("change", function(ev, attr, how, newVal) {
            if(attr.indexOf('data.') === 0) {
                that.attr(attr.substr(5), newVal);
            }
        })
    }
    , computed_errors : can.compute(function() { return this.errors(); })
});
看看它在哪里起作用

我无法执行
此操作。validatePresenceOf(['fname','lname'])因为有多个表单,所以正在动态生成formObject。所以我不知道我的对象的属性是什么。我可以在init方法本身中访问我的对象吗?可以使用attr()函数myMap.attr()访问属性,循环和应用验证函数init是Can.Map的静态属性,attr是实例属性。如何在静态构造函数内部访问attr。如果我错了,请纠正我!!!无法在构造函数init方法中访问实例。恐怕你需要一些其他的解决办法。但是,您可以添加实例init方法,但是如果您在那里添加验证,您将最终为同一事物添加多个验证(为您实例化的每个对象添加一个验证)。@CherifBOUCHELAGHEM使用代码更新了问题,我无法
此操作。validatePresenceOf(['fname','lname')因为有多个表单,所以正在动态生成formObject。所以我不知道我的对象的属性是什么。我可以在init方法本身中访问我的对象吗?可以使用attr()函数myMap.attr()访问属性,循环和应用验证函数init是Can.Map的静态属性,attr是实例属性。如何在静态构造函数内部访问attr。如果我错了,请纠正我!!!无法在构造函数init方法中访问实例。恐怕你需要一些其他的解决办法。但是,您可以添加实例init方法,但是如果您在那里添加验证,您将最终为同一事物添加多个验证(每个实例化的对象一个)。@CherifBOUCHELAGHEM使用编解码器更新了问题。您可以给我们一个formObject的示例吗?我很难理解表单如何将数据放入模型实例中,并让应用程序的其他部分理解它。@air\u hadoken我使用的是
can.deparam(form.serailize())
,它将返回一个表单对象。现在,我想验证作为属性-值对存储在对象中的表单字段是否为空。@air\u hadoken用编解码器更新了这个问题。您能给我们一个表单对象的示例吗?我很难理解表单如何将数据放入模型实例中,并让应用程序的其他部分理解它。@air\u hadoken我使用的是
can.deparam(form.serailize())
,它将返回一个表单对象。现在我想验证作为属性-值对存储在对象中的表单字段是否为空。@air\u hadoken用codeNice更新了这个问题,静态设置函数如何?没有提供更多解决方案吗?谢谢验证对象在静态设置()中不可用。您至少需要等待static init()@air\u hadoken Nice。根据需要对代码进行了一点修改,它就像一个魔咒一样工作。非常感谢您的帮助这没有指定,但是您应该能够使用一个映射构建验证器,然后通过调用验证器上的
.attr(“数据”)
来观察另一个映射。关于静态设置函数呢?没有提供更多解决方案吗?谢谢。静态设置()中没有验证对象。您至少需要等待static init()@air\u hadoken Nice。根据需要对代码进行了一点修改,它就像一个魔咒一样工作。非常感谢您的帮助这没有指定,但是您应该能够使用一个映射构建验证器,然后通过调用验证器上的
.attr(“数据”)
来观察另一个映射
can.Map("DynamicFormValidator", {
    newInstance : function(data) {
        var cls = this.extend();
        can.each(data.serialize(), function(val, key) {
            cls.validatePresenceOf(key);
        });
        //cls.prototypes.data = data;
        return can.Map.newInstance.call(cls, data);
    }
}, {
    init : function(data) {
        var that = this;
        this.attr("data", data);
        this.bind("change", function(ev, attr, how, newVal) {
            if(attr.indexOf('data.') === 0) {
                that.attr(attr.substr(5), newVal);
            }
        })
    }
    , computed_errors : can.compute(function() { return this.errors(); })
});