如何在纸张输入中添加自定义验证器?

AKh*_*AKh 11 html javascript html5 polymer polymer-1.0

需要添加一个自定义验证器,它根据html中其他字段的值进行一些复杂的验证.

尝试将自定义验证器函数作为属性添加到纸张输入元素,但它根本 不会被调用.

    <dom-module id='custom-ele'>
            <paper-input is="iron-input" id='input_1' label='Label_1' validator='validate_1'></paper-input>
            <paper-input is="iron-input" id='input_2' label='Label_2' validator='validate_2'></paper-input>
            ...
    </dom-module>
    <script>
    Polymer({

        is: 'custom-ele',

        validate_1: function() {
            //validation code
        },

        validate_2: function() {
           //validation code 
        }

    });
    </script>
Run Code Online (Sandbox Code Playgroud)

Mar*_*ria 14

验证器必须实现IronValidatorBehavior(参见文档).此外,如果要自动验证,则需要设置auto-validate属性.为了实现您的目标,您可以为要使用的每种验证类型创建自定义验证器.或者,您可以创建一个通用的自定义验证器,并在初始化时设置验证功能.这是一个例子.

Polymer({

    is: 'custom-validator',

    behaviors: [
        Polymer.IronValidatorBehavior
    ]
});

<dom-module id='validation-element'>
    <template>
        <custom-validator id="valid1" validator-name="validator1"></custom-validator>
        <custom-validator id="valid2" validator-name="validator2"></custom-validator>
        <paper-input auto-validate id='input_1' label='Label_1' validator='validator1'></paper-input>
        <paper-input auto-validate id='input_2' label='Label_2' validator='validator2'></paper-input>
    </template>
</dom-module>
<script>

    Polymer({

        is: 'validation-element',

        validate1: function(value) {
            //validation code
            console.log("validate1");
            return value.length > 3;
        },

        validate2: function(value) {
            //validation code
            console.log("validate2");
            return value.length > 5;
        },

        ready: function() {
            this.$.valid1.validate = this.validate1.bind(this);
            this.$.valid2.validate = this.validate2.bind(this);
        }

    });

</script>
Run Code Online (Sandbox Code Playgroud)

你可以在这个插件中找到一个有效的例子.


Kje*_*ell 7

好吧,我的答案可能不是"聚合物方式",但它有效并且更像是"传统的程序化"方式.

这个解决方案的简短想法列表:

  1. paper-input aka iron-input查找iron-meta全局对象中validator属性的值
  2. 每个Polymer.IronValidatorBehavior都有一个名称(validatorName),一个类型('validator')和一个验证函数
  3. 每个Polymer.IronValidatorBehavior都将自己注册在iron-meta对象的相应"validator"列表中

所以这是我从以上几点得出的简短代码:

var validator = {
    validatorName: 'my-custom-validator',
    validatorType: 'validator',
    validate:      function(value) { ...my validation code... }
};
new Polymer.IronMeta({
    type: validator.validatorType,
    key: validator.validatorName,
    value: validator
});
Run Code Online (Sandbox Code Playgroud)

您可以将此代码放在任何"附加"或"已创建"事件处理程序中.但是在完成任何验证之前运行它当然......

然后你就可以写了

<paper-input validator="my-custom-validator"></paper-input>
Run Code Online (Sandbox Code Playgroud)

如果您想检查您的验证器是否注册了输入,请在任何开发工具中向下导航dom-tree并点击:$0.hasValidator()$0.validator查看您的验证器是否已成功注册输入.