我已经看到了其他问题,我觉得我的问题不是那些问题。
Breezejs [Q] Unhandled rejection reasons (should be empty)
Unhandled rejection reasons (should be empty)
好的,所以我一直在关注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并且它与谷歌浏览器一起使用,我花了数小时,数天,数周和头痛来制作我想在IE7中工作的东西。添加疯狂数量的浏览器支持脚本,即-shivs和ie-shims ..如此接近,然后找不到localStorage。我希望BreezeJS能够更多地记录IE7中不支持的内容,我有很大一部分客户使用IE7和IE8,并且很难编程并且在下班后发现它不起作用。< / p>
答案 0 :(得分:2)
我并不是故意将责任归咎于Breeze技术。我很晚才意识到它也是一个有棱角的东西。但是,我已经实现了应用程序,Breeze + Angular可以在IE7上运行。只需要关闭一些功能。
(弃用方式)
我决定以一种方式“版本化”我的javascript,我可以检测旧的IE版本并做出让步:
Detect IE version in 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 Metadata
关闭hasServerMetadata,您的实体的响应看起来就像一个普通的javascript对象。如果它已打开,并且您不使用IE7,则它可能是一个实体对象,您可以缓存并进行查询。
答案 1 :(得分:1)
Breeze + Angular在IE8或更早版本中不起作用。对不起,你花了很长时间才发现这一点。我很抱歉你被诅咒需要支持IE7和IE8;这是一项艰难的任务。
我们从一开始就在文档中非常明确地提到了这一点。例如,请参阅"Todo Angular Sample"和Breeze/Angular页面上的大蓝色通知框。
使用术语“breeze angular ie8”搜索StackOverflow将返回January 2013 question and answer,其中我们再次明确指出Breeze和Angular的组合不起作用,并且永远不会在IE8或任何浏览器中工作缺乏对getters和setter的ECMAScript 5属性的支持。
您是否知道Angular团队在1.x版本序列的所有未来版本中也放弃了对IE8的支持?他们说它可能在IE8中工作,但是他们不会再做任何确保它确实......也不会费心去测试它是否会这样做。
我应该补充一点,Breeze在IE8(和IE7)中使用Knockout(和Durandal)可以正常工作,尽管我们也已经停止在IE8上测试Breeze。
最后,让我说我印象深刻,你可以让Breeze + Angular完全使用IE7。祝你工作顺利。