yii2 动态客户端验证错误 URL - 无法读取未定义的 属性 'test'

yii2 Error of dynamic client validation URL - Cannot read property 'test' of undefined

我使用 jquery 动态添加一个字段,然后将该字段动态添加到验证列表中,如 link (Adding and removing fields dynamically) 中所示。在我的代码中,我添加了 url validation.

function validateDynamicField() {
    $('#serial-form').yiiActiveForm('add', {
        id: 'link-1-link',
        name: 'link-1-link',
        container: '.field-link-1-link',
        input: '#link-1-link',
        error: '.help-block',
        enableAjaxValidation: true,
        validate:  function (attribute, value, messages, deferred, $form) {
            yii.validation.required(value, messages, {
                "message": "Name be blank bug."
            });
            yii.validation.url(value, messages, {
                "message": "Name must be a url."
            });
        }
    });
}

在客户端 url 验证字段出现错误:

Uncaught TypeError: Cannot read property 'test' of undefined in yii.validation.js.

第 244 行出现此错误:

if (!valid || !options.pattern.test(value)) {

这是因为您需要提供验证 URL 所依据的模式,因为您正在调用 validation.url 您应该传递的完整选项

{
    "pattern": /^(http|https):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(?::\d{1,5})?(?:$|[?\/#])/i,
    "message": "Name must be a url.",
    "enableIDN": false,
    "skipOnEmpty": 1
}

enableIDN: 验证过程是否应考虑 IDN(国际化域名)。

如果您在文件 yii.validation.js 中函数 url 的开头添加 console.log(options);,然后进入任何添加了 URL 字段的表单通常模型内的规则为 url,例如,如果模型中有一个 website 字段,则规则应类似于 [['website'],'url'] 然后按下带有空输入的提交按钮,您将查看 console.log(options) 输出与上面相同,通过核心验证器规则进行了调整。

所以将您的代码更改为

function validateDynamicField() {
    $('#my-form').yiiActiveForm('add', {
        id: 'link',
        name: 'link',
        container: '.field-link',
        input: '#link',
        error: '.help-block',
        enableAjaxValidation: true,
        validate:  function (attribute, value, messages, deferred, $form) {
            yii.validation.required(value, messages, {
                "message": "Name be blank bug."
            });
            yii.validation.url(value, messages, {
                "pattern": /^(http|https):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(?::\d{1,5})?(?:$|[?\/#])/i,
                "message": "Name must be a url.",
                "enableIDN": false,
                "skipOnEmpty": 1
            });
        }
    });
}