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, это был бы объект сущности, к которому вы можете кешировать и выполнять запросы.