Breezejs: [Q] Необработанные причины отказа (должно быть пустым)

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

Breezejs [Q] Необработанные причины отказа (должно быть пустым)

Необработанные причины отказа (должно быть пустым)

Хорошо, так что я следил за breezejs; как можно ближе следуя документации, а также образцам, но я продолжаю сталкиваться с той же проблемой. Код, который я представлю, работает в IE9+ и Chrome, но когда я пробую его в IE7 и IE8, он взрывается.

Вот мой контроллер на стороне сервера (с использованием webapi 2):

namespace Map.API.Controllers
{
    [BreezeController]
    public class LocationController : ApiController
    {
        readonly EFContextProvider<LocationEntities> _contextProvider =
            new EFContextProvider<LocationEntities>();

        [HttpGet]
        public string Metadata()
        {
            return _contextProvider.Metadata();
        }

        [HttpGet]
        public IQueryable<dbSTATES> States()
        {
            return _contextProvider.Context.MD_STATE_CD;
        }
    }
}

вот мой угловой завод:

mapapp.app.factory('StateContext', ['$http', 'StateModel', function ($http, StateModel) {
    configureBreeze();
    var dataService = new breeze.DataService({
        serviceName: "/Map.API/api/Location"
    });

    var datacontext = {
        getAllStates: getAllStates,
        getCachedStates: getCachedStates
    };
    return datacontext;

    /* BLOWS UP AFTER RUNNING MANAGER.EXECUTEQUERY(QUERY) */
    function getAllStates() {
        var query = breeze.EntityQuery
                .from("States");
        return manager.executeQuery(query);
    }

    function getCachedStates() {
        var query = breeze.EntityQuery
        .from("States").toType('MD_STATE_CD');
        return manager.executeQueryLocally(query);
    }

    function configureBreeze() {
        // configure to use webapi
        breeze.config.initializeAdapterInstances({ dataService: "webApi" });
    }
}

Вот как я это называю с моего углового контроллера:

    StateContext.getAllStates().then(
        function (data) {
            var localData = data.results;  //never gets here
            logger.info("Fetched States");
        }).fail(function (e) { 
            logger.info(e);  //always gets here
        }).done();

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

Если мне случится отключить метаданные:

var dataService = new breeze.DataService({
    serviceName: "/Map.API/api/Location",
    hasServerMetadata: false
});

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

Несмотря на то, что я люблю BreezeJS и он работает феноменально с Google Chrome, я потратил часы, дни, недели и головные боли на то, чтобы сделать то, что я хочу, в IE7. Добавление безумного количества сценариев, поддерживающих браузеры, т.е.-shivs и ie-shims... подойдя так близко, что обнаружение localStorage не поддерживается. Я хотел бы, чтобы BreezeJS документировал больше о том, что не поддерживается в IE7, у меня есть большая часть моих клиентов, которые используют IE7 и IE8, и очень сложно программировать вещи и узнавать в нерабочее время, что это просто не работает.

2 ответа

Решение

Breeze + Angular не работает в IE8 или более ранних версиях. Извините, что вы так долго это открывали. Я также сожалею, что вы прокляты необходимостью поддерживать IE7 и IE8; это сложное задание.

Мы были совершенно ясны и откровенны об этом в нашей документации с самого начала. См., Например, большое синее поле для уведомлений на "Образце углового тодо" и на странице " Бриз / Угол".

Поиск в Stackru с терминами "breeze angular ie8" возвращает вопрос и ответ от января 2013 года, в котором мы вновь недвусмысленно заявляем, что комбинация Breeze и Angular не работает и никогда не будет работать в IE8 или любом браузере, в котором отсутствует поддержка Свойства ECMAScript 5 с геттерами и сеттерами.

Знаете ли вы, что команда Angular также отказывается от поддержки IE8 во всех будущих выпусках в последовательности версий 1.x? Они говорят, что это может работать в IE8, но они не будут предпринимать дальнейших попыток убедиться, что это работает... и не потрудятся протестировать, чтобы увидеть, работает ли это.

Я должен добавить, что Breeze отлично работает с Knockout (и Durandal) в IE8 (и, возможно, IE7), хотя мы также прекратили тестировать Breeze на IE8.

Наконец, позвольте мне сказать, что я впечатлен тем, что вы смогли заставить Breeze + Angular работать с IE7. Я желаю вам всего наилучшего в ваших усилиях.

Я не хотел прямо обвинять технологию Breeze в своем приложении. Я понял поздно, что это тоже была угловатая вещь. Тем не менее, я реализовал приложение таким образом, что Breeze + Angular работает на IE7. Просто нужно отключить несколько функций.

(Не рекомендуется)
Я решил "версия" моего JavaScript таким образом, чтобы я мог обнаружить более старые версии IE и сделать соответствующие рекомендации:

Определить версию IE в Javascript

Таким образом, в моем коде javascript я бы обнаружил, используется ли более старый браузер IE, и оттуда пересмотреть, как я получаю данные; где, если бы использовались более новые браузеры, я бы воспользовался преимуществами BreezeJS + Angular.

(Полезные советы)
Немного разочаровывает, что до этого дошло.

Чтобы изящно обрабатывать запросы, я прочитал пост (и поговорил с автором) о шаблоне запроса / обработчика, описанном здесь:

https://cuttingedge.it/blogs/steven/pivot/entry.php?id=92

Для тех, кто хочет иметь похожий на угловой фреймворк с нокаутом (просто для поддержки старых браузеров), посмотрите durandal: http://durandaljs.com/ (который, похоже, получает поддержку для нокаутов и угловых фанатов)

(Обновление - 08/11/2014 - я удалил логику, о которой упоминалось в браузере [if lt IE8], и обработал через javascript в моем контроллере. Я также удалил возможность кэширования во всех браузерах, обработка сервера работала нормально с тем, что требовалось

Так как angular не очень хорошо поддерживает IE7, я разделил код на две разные страницы, одна из которых называется Home.html и HomeIE7.html. Хотя это больше обслуживания, я думаю, что это лучше, чем два набора логики на одной HTML-странице. Для любых внесенных изменений я использую программу "Beyond Compare", которая позволяет мне анализировать оба файла и следить за тем, чтобы логика была одинаковой между ними.

Чтобы переключиться между двумя страницами, вот как выглядит мой начальный Index.html:

<!DOCTYPE html>

<div ng-app="mapapp" id="ng-app">
    <div ng-controller="LocationCtrl">
        <div ng-include="homeHTML" />
    </div>
</div>

и в вашем контроллере:

//templates to use - picks html to use, and doesn't use the ajax caching
$scope.homeHTML = !$('html').hasClass('msie7') ?
                        "Templates/Home.html?" + new Date().getTime() : 
                        "Templates/HomeIE7.html?" + new Date().getTime();

Помните, что если вы используете IE7, убедитесь, что при вызове службы от breeze hasServerMetadata выключен.

var dataService = new breeze.DataService({
    serviceName: serviceName,
    hasServerMetadata: false
});

Поскольку IE7 не способен использовать какие-либо расширяемые возможности использования метаданных сервера. Чтобы узнать эти расширяемые функции, пожалуйста, нажмите на следующее: Метаданные Breeze

При отключенном hasServerMetadata ответ ваших сущностей будет выглядеть как обычный объект javascript. Если он был включен, и вы не используете IE7, это был бы объект сущности, к которому вы можете кешировать и выполнять запросы.

Другие вопросы по тегам