dijit.form.ValidationTextBox дважды вызывает функцию валидатора onBlur - PullRequest
1 голос
/ 28 декабря 2011

У меня есть вызов AJAX для проверки доступности имени пользователя с помощью Dojo и PHP. Все работает отлично, но за этим что-то происходит. Каждый раз, когда я набираю слово или во время события onBlur, dojo делает вызов AJAX дважды, а иногда и трижды. Я прочитал эту ссылку , и они говорят, что это исправлено начиная с 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 голосов
/ 29 декабря 2011

Спасибо за ответ.Первоначально я планировал связаться с сервером, проверить доступность имени пользователя через AJAX и вернуть var _isAvailable, чтобы вызвать свойство invalidMessage ValidationTextBox, если результат равен false.Это также приведет к тому, что всплывающая подсказка появится рядом с текстовым полем, что я и хотел.

Простите за мои небольшие знания по dojo, так как я впервые использую эту платформу.

0 голосов
/ 29 декабря 2011

Вы можете использовать маленький трюк, как:

внутри вас 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]);
    })
});
}

тогда где-нибудь в вашем коде или в вашем виджете вы делаете подписку на тему, чтобы при публикации чего-либо вы запускали функцию?

...