Как обработать ошибку в Resolver

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

Ключом к успешной работе с совместимостью браузера является обнаружение поддержки необходимых вам функций и полифония или грациозно деградировать эти особенности. Обнаружение фактической версии браузера или браузера является плохой практикой и, вероятно, даст вам проблемы как с ложными срабатываниями, так и с ложными негативами. Поскольку вся цель упражнения заключается в том, чтобы избежать сбоев в работе, наличие неточных результатов делает все это несколько самозавершающимся.

Для обнаружения функций Modernizr - отличный инструмент, но если вы действительно не получаете наряду с этим, как вы говорите в вопросе, вот крошечная небольшая функция JS, которая специально определяет поддержку типа поля ввода даты:

/**
 * @returns boolean - True if browser suppors 'date' input type.
 */
function browserSupportsDateInput() {
    var i = document.createElement("input");
    i.setAttribute("type", "date");
    return i.type !== "text";
}

Как вы можете видеть, это действительно простой материал. (Вы можете найти его более подробно здесь , кстати)

С этой функцией на вашем сайте теперь становится очень легко полировать поле даты.

Вот ваш HTML:


Теперь у вас может быть крошечный бит jQuery, который делает следующее:

$(function() {
    if(!browserSupportsDateInput()) {
        $(".datepicker").datepicker();
    }
});

Простой.

Конечно, Modernizr сделает это лучше. Modernizr не выполняет сам полиполк, поэтому вам нужен код, похожий на приведенный выше, чтобы применить плагин datepicker, если тип ввода даты не поддерживается, но то, что делает Modernizr, которое я не делал в моем коде выше, является чтобы вы могли сообщить браузеру только загружать библиотеку datepicker, если это необходимо. Это позволит сэкономить много полосы пропускания для современных браузеров. Modernizr делает такие вещи мертвыми легко.

Надеемся, что вышеизложенное даст вам некоторую пищу для размышлений о лучшем способе делать подобные вещи. Это все о лучшей практике. Если вы чувствуете, что вы должны делать это на PHP, то пусть будет так, но просто имейте в виду, что вы идете против рекомендации почти всех экспертов там, и это даст вам больше головных болей в длинный пробег.

30
задан Matt M 10 May 2017 в 17:16
поделиться

1 ответ

Я только хотел предоставить очень похожий обновленный ответ, но с некоторым обновленным кодом. Я лично думаю, что ошибкой нельзя просто управлять в сопоставителе.

, Почему? Ну, я думаю, что задание сопоставителя состоит в том, чтобы решить, для не выяснения, что сделать, если оно не может решить . Мы могли бы использовать этот сопоставитель в двух или трех различных компонентах, и каждый из них мог бы решить реагировать по-другому, если сопоставитель перестал работать. Мы могли бы хотеть перенаправить в одном из них к 404 страницам, но в другом, возможно, мы просто пытаемся зафиксировать любезно ошибку путем отображения чего-то еще.

Несомненно, мы могли бы также хотеть реагировать по-другому, в зависимости от какой ошибки мы добираемся: возможно, пользователь не был авторизован, или возможно что объект был удален или даже не существовал на первом месте, кто знает. Мы могли бы хотеть отобразить различные результаты и в этом случае меня полностью, upvote DeborahK обновил ответ. Но для большинства случаев, я думаю, что это сверхусложняет вопрос (дополнительный интерфейс только для сопоставителя, удостоверяясь ошибка внутри, это является описательным...) и что мы, вероятно, не будем действительно заботиться, почему сопоставитель перестал работать: это просто сделало, позволяет компоненту, которому была нужна та фигура объекта, что сделать, и идти дальше.

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router';
import { Observable, of } from 'rxjs';
import { catchError } from 'rxjs/internal/operators';
import { Product } from '../_interfaces';
import { ProductsService } from '../_services';

@Injectable()
export class ProductResolver implements Resolve<Product> {

    constructor(private productsService: ProductsService) {
    }

    public resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {
        const id = route.paramMap.get('id');
        return this.productsService.getProduct(id).pipe(
            catchError(error => {
                console.error(`Can't resolve product with id ${id} because of the error:`);
                console.error(error);
                return of(null);
            })
        );
    }
}
0
ответ дан 27 November 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: