dijit.form.ValidationTextBox在onBlur上调用两次验证函数

时间:2011-12-28 13:55:06

标签: ajax dojo

我有一个AJAX调用来检查使用Dojo和PHP的用户名的可用性。一切都很好,但背后有一些巨大的事情发生。每次我输入一个单词或在onBlur事件期间,dojo都会使AJAX调用两次,有时甚至三次。我读了这个link,他们说从v1.3开始就修复了,我使用的是v1.7。我尝试将AJAX函数放在setTimeout()内并延迟3秒,但仍然会发生同样的事情。如何防止这种情况并只进行一次AJAX调用?

var _username = new dijit.form.ValidationTextBox({
name : "{{ username.name }}",
type : "text",
required : true,
invalidMessage : message.invalid.username
}, "{{ username.id }}");

dijit.byId("{{ username.id }}").validator = fnUsernameAvailable;

function fnUsernameAvailable(a) {
if (a === "" )
    return false;

dojo.xhrPost({
    url : "{{ site_url() }}/ajax/check_username_availability",
    handleAs: "json",
    content : {
        username : a,
        csrf_libtracking : fnCsrf()
    },
    load : function(data) {
        _isAvailable = data.result;
    }
});

return _isAvailable;
}

2 个答案:

答案 0 :(得分:0)

你可以用一个小技巧:

在你的ValidationTextBox里面,添加一个属性:

var _username = new dijit.form.ValidationTextBox({
_beingChecked: false,
name : "{{ username.name }}",
type : "text",
required : true,
invalidMessage : message.invalid.username
}, "{{ username.id }}");

function fnUsernameAvailable(a) {
if (a === "" || this._beingChecked)
    return false;

this._beingChecked = true;

dojo.xhrPost({
    url : "{{ site_url() }}/ajax/check_username_availability",
    handleAs: "json",
    content : {
        username : a,
        csrf_libtracking : fnCsrf()
    },
    load : dojo.hitch(this, function(data) {
//        _isAvailable = data.result; <-- is this really useful ?
        this._beingChecked = false;
        dojo.publish("some/topic/to/tell/widgets/it/is/done", [data.result]);
    })
});
}

然后在你的代码的某个地方,或者在你的小部件中你dojo.subscribe到主题,以便在发布某些东西时,你运行一个函数?

答案 1 :(得分:0)

感谢您的回复。我最初的计划是联系服务器,通过AJAX检查用户名是否可用,如果结果为{{1},则返回var _isAvailable以触发invalidMessage的{​​{1}}属性}。这也会触发工具提示出现在我想要发生的文本框旁边。

请原谅我对ValidationTextBox的一点知识,因为这是我第一次使用这个框架。