2012-04-03 18 views
2

將YUI3自動填充小部件與使用返回JSON數據的URL源一起使用時,是否有一種簡單的方法來檢測HTTP錯誤響應?如何使用YUI3自動填充小部件處理遠程數據源錯誤?

實施例:(例如,如果用戶沒有在該服務器上認證時,自動填充小部件接收的401響應和靜默失敗,但將錯誤記錄到控制檯)

Y.one('#ac-input').plug(Y.Plugin.AutoComplete, { 
    resultHighlighter : 'phraseMatch', 
    source : "http://example.com/api/item/search/?q={query}", 
}); 

我已經搜索,但沒有找到具體到這個問題的文檔 - 源潛水也沒有幫助,無論是。我認爲我將不得不推出我自己的數據源對象,以便我可以發出請求並檢測錯誤。

或者是否有一種更簡單的方式將錯誤事件處理程序傳遞給YUI3自動填充小部件以用於此類型的數據源?

編輯:請參閱my follow-up answer以獲取使用Y.on('io:failure')的簡單解決方案。

回答

1

一個簡單的解決方案:使用全局IO失敗事件處理程序。它的工作原理沒有DataSource.IO對象的複雜性,如this answer中所述。

雖然我寧願在AutoComplete小部件事件處理程序的本地處理錯誤,但唉,我還沒有找到一個簡單的方法來做到這一點。

使用Y.on('io:failure')如果您只需要顯示有關comms錯誤的信息,則事件處理可能是更直接的方法。

// 
// Handle IO failure event 
function ioFailureFunction(transaction, xhrObject) { 
    errCode = xhrObject.status; 
    // Insert the current error status into an HTML element... 
    Y.one('#error').setContent(errCode); 
}; 
Y.on('io:failure', ioFailureFunction); 

理由:我發現,使用this answer概述的DataSource.IO方法可能引入顯著的複雜性,所以如果你有簡單的需求,這種方法是有利的,並用簡單的自動完成配置工作 - 這樣你可以保持你的AutoComplete配置簡單,仍然可以處理IO錯誤...

+1

好注意。感謝您的跟進。 – mjhm 2012-05-02 18:07:27

1

我認爲Y.DataSource是傳遞錯誤處理程序的簡單方法。你應該能夠做這樣的事情:

var ds = new Y.DataSource.IO({ 
    source: 'http://example.com/api/item/search/' 
}); 

ds.set('ioConfig', { 
    on: { 
     failure: function (transactionID, ioResponseObj, args) { 
      ... 
     } 
    } 
}; 

Y.one('#ac-input').plug(Y.Plugin.AutoComplete, { 
    requestTemplate: '?q={query}', 
    source: ds 
}); 

這是看在failureHandler末尾的「應用」功能調用。

當然請注意,Same Origin policies適用。

+0

完美的工作!謝謝。 – Inactivist 2012-04-06 14:25:48

+0

Erm ...嗯,它的工作原理,但使用DataSource.IO方法可能會引入其他複雜性和問題...所以,雖然上述方法確實有效,但我一直在尋找更簡單的解決方案,如果我只想做記錄或顯示錯誤指示。 – Inactivist 2012-05-02 04:46:19

相關問題