2017-02-09 3 views
1

Eng просил, чтобы я позволил им войти в специальные условия проверки должны быть переданы нашему Generic валидатора с помощью атрибута данных, таких как:Как передать состояние с помощью данных атрибутов для JS для проверки

data-clv_special_condition="$(this).val()=='X'" 

на JS стороны я должен был бы захватить этот атрибут данных и подключить его к нашей проверки, такие как:

$('[data-clv_special_condition]').each(function(){ 
    if($(this).data('clv_special_condition')){ 
     //Do something 
    }) 
}); 

Однако, как вы можете себе представить, что-то вроде этого не будет работать. Может ли кто-нибудь предложить какие-либо решения для передачи условия из атрибута data в JS для проверки? Благодаря!

ответ

0

Я решил эту точную проблему в прошлом, используя специальную структуру проверки, которую я построил, хотя я не думаю, что это сработает для вашего дела.

В вашем случае, я думаю, что простой eval() будет работать (даже если это нецелесообразно)?

$('[data-clv_special_condition]').each(function(){ 
 
    var success = eval($(this).data('clv_special_condition')); 
 
    if (!success) { 
 
    console.log("doh!"); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> 
 

 
<input data-clv_special_condition="$(this).val() == 'Yes!';" value="No!" />

+0

Добавлен функциональный фрагмент. –

+0

На самом деле это действительно работает! Благодаря! – Adrianopolis

+0

Это, вероятно, не очень хорошая идея. Все это может быть введено и выполнено вашим кодом таким образом. – Jan

0

насчет экономии только имя валидатора в атрибуте данных, как:

<input data-clv_special_condition="validatorOne" /> 

и хранение логина проверки в коде JS, см:

var validators = { 
    validatorOne: function(element) { ... }, 
    validatorTwo: function(element) { ... }, 
}; 

$('[data-clv_special_condition]').each(function(){ 
    var validatorName = $(this).data('clv_special_condition'); 
    if(validators[validatorName](this){ 
     //Do something 
    }); 
}); 
+0

Возможно, что-то вроде этого лучше работает с синтаксисом HTML, например 'data-validate-validatorOne =" Сообщение об ошибке "', no? Таким образом, вы можете иметь несколько валидаторов для каждого ввода. Кстати, я думаю, что целью, которую он пытается достичь, является пользовательский код проверки jQuery в самом значении атрибута. –

1

Вместо того, чтобы позволить им установить полный экспресс ion, почему бы не добавить ряд атрибутов условных данных с их собственной логикой в ​​вашем контроллере? Как

data-clv_equals="X" data-clv_notequals="Y" data-clv_regex="Z" 

и в вашем валидатора что-то вроде

var isValid = true; 

if ($(this).data('clv_equals')) { 
    isValid &= $(this).data('clv_equals') === $(this).val(); 
} 

if ($(this).data('clv_notequals')) { 
    isValid &= $(this).data('clv_notequals') !== $(this).val(); 
} 

if ($(this).data('clv_regex')) { 
    var regex = new RegExp($(this).data('clv_regex')); 
    isValid &= regex.test($(this).val()); 
} 

Это имеет смысл с точки зрения как данных и с логической точки зрения в вашем коде. Отделяет данные от логики и не позволяет вам анализировать выражение (с потенциально опасными последствиями).

+0

Да, я тоже думал о том, чтобы делать что-то подобное, но они могут усложниться. И правда, я могу решить и для этого. – Adrianopolis

+1

Не только для потенциальных рисков безопасности при передаче такого контроля, также учитывайте, что одно ошибочное выражение может вызвать ошибку, которая нарушает выполнение другого кода. Я бы настоятельно советовал ни о чем, а не разбирал выражение самостоятельно. Но если вы все равно должны это делать, добавление конкретных атрибутов, вероятно, будет более простым. Другая возможность позволила бы использовать регулярное выражение (которое по-прежнему может быть одним из необязательных атрибутов при таком подходе). – Jan

+0

Просто хотел дать вам обновление. Это работает хорошо. Благодарю. – Adrianopolis