我正在构建表单验证并学习promises我决定使用promise模式实现异步验证函数:
var validateAjax = function(value) {
return new Promise(function(resolve, reject) {
$.ajax('data.json', {data: {value: value}}).success(function(data, status, xhr) {
if (data.valid) {
resolve(xhr)
}
else {
reject(data.message)
}
}).error(function(xhr, textStatus) {
reject(textStatus)
})
})
}
//...
var validators = [validateAjax];
$('body').delegate('.validate', 'keyup', function() {
var value = $('#the-input').val();
var results = validators.map(function(validator) {
return validator(input)
});
var allResolved = Promise.all(results).then(function() {
//...
}).catch(function() {
//...
})
});
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,输入被验证为用户类型(代码简化不会太长,例如缺少keyup后的超时等等).
现在我想知道如果前一个keyup事件的验证仍在进行中,如何终止ajax请求.是否可能以某种方式检测承诺在哪种状态并且可能拒绝来自外部的承诺?
我正在尝试在Symfony 2中创建一个新的表单类型.它基于实体类型,它在前端使用select2,我需要用户能够选择现有实体或创建新实体.
我的想法是发送实体的id,如果用户选择现有实体,则让它由默认实体类型转换,或者如果用户输入新值,则发送类似"_new:输入文本"的内容.那么这个字符串应该由我自己的模型转换器转换为新的表单实体,它看起来应该是这样的:
<?php
namespace Acme\MainBundle\Form\DataTransformer;
use Symfony\Component\Form\DataTransformerInterface;
class EmptyEntityTransformer
implements DataTransformerInterface
{
private $entityName;
public function __construct($entityName)
{
$this->entityName = $entityName;
}
public function transform($val)
{
return $val;
}
public function reverseTransform($val)
{
$ret = $val;
if (substr($val, 0, 5) == '_new:') {
$param = substr($val, 5);
$ret = new $this->entityName($param);
}
return $ret;
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,仅在选择现有实体时才调用变换器.当我输入一个新值时,该字符串将在请求中发送,但根本不会调用变换器的reverseTransform方法.
我是Symfony的新手,所以我甚至不知道这种方法是否正确.你有什么想法如何解决这个问题?
编辑:我的表单类型代码是:
<?php
namespace Acme\MainBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Acme\MainBundle\Form\DataTransformer\EmptyEntityTransformer;
use Symfony\Component\PropertyAccess\PropertyAccess;
use …Run Code Online (Sandbox Code Playgroud) ajax ×1
cancellation ×1
forms ×1
javascript ×1
php ×1
promise ×1
symfony ×1
symfony-2.5 ×1
transform ×1