2015-08-25 65 views
3

使用聚合物1.0,我正在尋找最佳的方法來顯示當應用程序從應用程序服務收到401時登錄到用戶。全球響應聚合物中的401

使用Angular我會考慮使用httpInterceptor來做到這一點,是否有一個等價的聚合物?

下面是從一個服務元素明確的路線錯誤(使用鐵AJAX)

<template is="dom-bind" id="app"> 
    <values-service values="{{items}}" on-error="onError"></values-service> 

    <h1>Items <span>{{items}}</span></h1> 

    <template is="dom-repeat" items="{{items}}"> 
     <p>{{item}}</p> 
    </template> 
</template> 

<script src="app.js"></script> 

和我的應用程序的腳本

(function (document) { 
    'use strict'; 

    var app = document.querySelector('#app'); 

    app.onError = function (e) { 

     console.log('app.onError ' + e.detail.request.status); 
    }; 

    app.addEventListener('error', app.onError); 

})(document); 

這個工程的做法,但作爲登錄名是我想要的東西發生時無需特別連接元素

回答

1

答案是向上通過DOM

<div on-error="onError"> 
    <values-service values="{{items}}"></values-service> 
    <other-service></other-service> 
    ... 

</div> 

和一些腳本捕捉誤差作爲事件氣泡的最外元件上(如上述)

app.onError = function (e) { 

    console.log('app.onError ' + e.detail.request.status); 
}; 

當任何所包含的服務,或任何包含的服務元素包含服務發生錯誤,處理程序將觸發 - 我做一個請求和401的相關檢查,並顯示我的登錄對話框

+0

唯一的缺點是401檢查必須在每個回調中;當你有足夠的這些代碼時,會有很多重複的和可能很脆弱的代碼。如果將value-service元素包裝到新元素中,則可以使用相同的系統,該元素將查找401s並顯式激發命名爲401的事件。 – newfivefour

+0

401由我的api控制 –

+0

這種方法意味着不存在重複,根中只有一個401處理程序。所以不像你描述的那樣 –

1

爲了解決這個問題,我創建了一個用於所有Ajax請求的組件。在該組件中,從服務調用中收聽401,並在找到時調用this.fire('401-found')。

然後在我的其他組件中,我聽了這樣的事件 - 在我的情況下,在主文檔中彈出一個對話框,要求用戶再次登錄。

稍微好一點的方法是讓Ajax組件接受參數來說'yes fire a 401 event'和'不給它標準的401事件,名字叫它this'然後在你可以聽的每個組件中爲此類事件作出相應的反應。

+0

感謝您的回覆,這是一個好主意。事情是我可能會使用我沒寫的ajax組件:/ –

+0

爲什麼不將這些ajax組件嵌入到你自己的組件中?我嵌入聚合物ajax組件,然後查看401響應的響應對象。你使用什麼組件來進行服務調用? – newfivefour

+0

這是我的示例中的值服務,但這裏的要點是全局401處理 –

1

我最近做了一個PR到iron-ajax(幾天前合併),增加了一個可選的bubbles屬性來完成這個。當存在bubbles屬性時,iron-ajax的request,responseerror事件冒泡爲window。這意味着您可以在window上擁有全局事件偵聽器,並處理401 s,但您希望不會有任何更多的代碼重複,並將bubbles添加到您的iron-ajax調用中。

更重要的是,因爲它是iron-ajax的一部分,所以它由Polymer團隊正式支持。

這是the official docs

+0

這太棒了! (並且經得起時間的考驗)謝謝 – Skyguard