2011-12-28 27 views
1

我有一個AJAX調用來檢查使用Dojo和PHP的用戶名的可用性。一切都很好,但是背後有一些事情發生了。每次我輸入一個單詞或在onBlur事件中,dojo都會發起兩次AJAX調用,有時甚至會發生三次。我讀了link,他們說它從v1.3開始就是固定的,我正在使用v1.7。我試着在setTimeout()裏放入AJAX函數,並延遲了3秒,但仍然發生同樣的事情。如何防止並只做一個AJAX調用?dijit.form.ValidationTextBox調用validator函數兩次onBlur

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; 
} 
+0

這可能與您的問題沒有任何關係,但我認爲您不會在_isAvailable中獲取任何內容,因爲您的xhrPost是異步的。您可以添加sync:true以使其同步,但您最好使用dojo.when或dojo.then ... – Philippe 2011-12-28 16:57:52

回答

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到主題,以便在發佈內容時運行一個函數?

+0

感謝您的支持。我不熟悉'dojo.hitch,dojo.subscribe和dojo.publish'。再次評論之前最好先閱讀。非常感謝! – 2011-12-29 13:32:25

+0

沒問題,學習需要時間,不要忘記接受答案:) – PEM 2012-01-05 11:45:10

0

感謝您的回覆。我原來的計劃是聯繫服務器,通過AJAX檢查用戶名是否可用,如果結果爲false,則返回var _isAvailable以觸發ValidationTextBoxinvalidMessage屬性。這也會觸發工具提示出現在我想要發生的文本框旁邊。

請原諒我對dojo的一些瞭解,因爲這是我第一次使用這個框架。