2015-08-25 7 views
3

Используя Polymer 1.0, я ищу наилучший подход к отображению логина для пользователя, когда приложение получает 401 из сервисов приложений.Отвечая глобально на 401 in Polymer

Использование углового Я бы посмотрел на использование httpInterceptor, чтобы сделать это, есть ли эквивалент в Polymer?

Вот подход, который явно перенаправляет ошибки от элемента обслуживания (с использованием железо-АЯКС)

<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

Ответ поймать ошибку на наружном элементе, как пузырь событий вверх через йот

<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's управляется моим api –

+0

Этот подход означает, что дублирования нет, в корне есть только один обработчик 401. Так что, как вы описали –

1

Чтобы решить эту проблему, я создал компонент, который использовался для всех моих запросов Ajax. В этом компоненте выслушали 401s из вызовов службы и вызвали this.fire ('401-found'), когда нашли.

Тогда в других моих компонентах я слушал такое событие - в моем случае, в основном документе, появилось диалоговое окно с просьбой снова войти в систему.

Немного лучший подход заключается в том, чтобы компонент Ajax принимал параметры, чтобы сказать «да, огонь 401 событие», и «не давайте ему стандартное событие 401, имя назовите это», то в каждом компоненте, который вы могли бы прослушать для таких событий и соответственно реагировать.

+0

спасибо за ответ, это хорошая идея. Дело в том, что я могу использовать компоненты ajax, которые я не писал:/ –

+0

Почему бы не встроить эти компоненты ajax в свои собственные? Я включил компоненты ajax полимера, а затем просмотрел объект ответа для 401 ответов. Какие компоненты вы используете для вызовов службы? – newfivefour

+0

Это то, что значение-сервис в моем примере есть, но точка здесь - глобальная обработка 401. –

1

Недавно я сделал PR до iron-ajax (который был объединен несколько дней назад), который добавляет необязательный атрибут bubbles, чтобы выполнить именно это. Когда присутствует атрибут bubbles, утюг-ajax's request, response и error события пузырька до window. Это означает, что вы можете иметь глобальные прослушиватели событий на window и обрабатывать 401 s, но вы хотите, чтобы без дублирования кода добавлялось bubbles к вашим вызовам iron-ajax.

Более того, поскольку это часть железного аякса, он официально поддерживается командой Polymer.

Адрес the official docs.

+0

это здорово! (и выдерживает испытание временем) спасибо – Skyguard