2014-02-08 33 views
0

我已经看到其他问题,并且我不认为我的问题是这些问题的重复。Breezejs:[Q]未处理的拒绝原因(应为空)

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中工作的内容。添加大量的浏览器支持脚本,即shiv和ie-shims ..非常接近,然后找不到localStorage。我希望BreezeJS会记录更多关于IE7不支持的内容,我有很大一部分客户使用IE7和IE8,并且编写程序并在几小时后发现它不起作用是非常困难的。

回答

1

Breeze + Angular在IE8或更早版本中不起作用。对不起,你花了很长时间才发现这一点。我也很抱歉,你被诅咒需要支持IE7和IE8;这是一项艰巨的任务。

我们从一开始就在文档中对此进行了相当清晰和前瞻性的介绍。例如,请参阅"Todo Angular Sample"Breeze/Angular页上的大蓝色注意框。

使用术语“breeze angular ie8”搜索StackOverflow会返回January 2013 question and answer,我们再次明确地指出,Breeze和Angular的组合不起作用,并且在IE8或任何缺乏对ECMAScript 5属性与getter和setters。

您是否知道Angular团队在1.x版本序列中的所有未来版本中都将支持IE8?他们说可能在IE8中工作,但他们将不会再进行尝试以确保它不会......但是他们也不会去测试它是否确实如此。

我应该补充一点,Breeze在IE8(也可能是IE7)中与Knockout(和Durandal)一起工作良好,尽管我们也停止在IE8上测试Breeze。

最后,让我说,我留下了深刻的印象,你能够让Breeze + Angular在IE7中工作。我祝你在努力中最好。

+0

嗯,我认为微风在ie9及以上版本上运行良好,我考虑到它;但是像我工作的大多数技术一样,在使用后向支持库时,后向支持是可行的。我并没有在ie7上真正体验过任何有关angular的问题,我很高兴使用它而不是使用knockout。 BreezeJS和元数据是我的问题。没有元数据的BreezeJS在IE7中工作正常,但只有服务器完成所有查询工作。 – sksallaj

+0

我读过关于javascript中没有支持什么的回复“没有defineProperty”或“没有geters或setter”,但我很乐观地认为我并不需要它。如果回复中包含诸如“BreezeJS仅支持IE9及更高版本缓存”的内容,那么避免这种情况会很有帮助;因为我不知道Breeze的核心JS内部使用了什么。至于角度支持,这是可以理解的,但同时令人失望。如果有两个版本的产品(Kinga就像JQuery 2.X和1.X),它会很好,它允许向后支持。 – sksallaj

+0

“,但只有当服务器完成所有查询”oops“的工作时,对于那个错误感到抱歉。我的意思是,只有当我不想使用缓存。 IE7能够查询服务器并获得结果。 – sksallaj

2

我并不是故意将责任归咎于Breeze技术,因为我的应用程序。我很晚才意识到这也是一件有趣的事情。然而,我已经实现了这样的应用程序,Breeze + Angular在IE7上工作。只需要关闭一些功能。

(不建议使用的方式)
我已经决定 “版本” 我的方式的JavaScript,我可以检测到旧版本的IE,让accomadations:

Detect IE version in Javascript

所以在我的javascript代码,我会检测是否正在使用较旧的IE浏览器,并从那里重新获取我如何获取数据;如果使用新的浏览器,我会利用BreezeJS + Angular的优势。

(有用的建议)
这是一个有点令人失望,它已经到了这一点。

要妥善处理查询,我读过后(如花的作者)对本文档介绍的查询/处理模式:

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

的人谁愿意与淘汰赛的角度状框架(只是为了支持旧版浏览器),看看durandal:http://durandaljs.com/(这似乎正在获得支持淘汰赛和角扇)

(更新 - 2014年8月11日 - 我删除了关于[如果lt IE8 ]在浏览器中,并通过javascript处理米y控制器。我也删除了所有浏览器的缓存能力,服务器处理工作很好,需要什么

由于角度不支持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,使确保在你的服务调用中,微风关闭了服务器元数据。

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

由于IE7无法使用任何可扩展的使用服务器元数据的功能。要了解这些可扩展功能,请点击以下:Breeze Metadata

关闭hasServerMetadata后,您实体的响应看起来就像一个普通的javascript对象。如果它已打开,并且您不使用IE7,则它将是一个实体对象,您可以缓存并进行查询。

相关问题