0

我已经看到其他问题提出这个问题,我不觉得我的问题与这些问题重复。

Breezejs [Q] 未处理的拒绝原因(应该为空)

未处理的拒绝原因(应为空)

好的,所以我一直在关注breathjs;尽可能接近文档以及示例,但我一直遇到同样的问题。我将展示的代码在 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 中工作的东西。添加疯狂数量的浏览器支持脚本,ie-shivs 和 ie-shims.. 如此接近,然后发现 localStorage 不受支持。我希望 BreezeJS 能够记录更多关于 IE7 不支持的内容,我有很大一部分客户使用 IE7 和 IE8,并且很难对事物进行编程并在数小时后发现它不起作用。

4

2 回答 2

2

我并不是故意将我的应用程序的责任归咎于 Breeze 技术。我很晚才意识到这也是一个有棱角的东西。但是,我已经实现了 Breeze + Angular 在 IE7 上工作的应用程序。只需要关闭一些功能。

(不推荐使用的方式)
我决定以一种可以检测旧版本的 IE 并进行调整的方式来“版本化”我的 javascript:

在 Javascript 中检测 IE 版本

因此,在我的 javascript 代码中,我会检测是否正在使用较旧的 IE 浏览器,并从那里重新连接我获取数据的方式;如果使用较新的浏览器,我会利用 BreezeJS + Angular。

(有用的建议)
到了这个地步有点令人失望。

为了优雅地处理查询,我阅读了一篇关于此处描述的查询/处理程序模式的帖子(并与作者交谈过):

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

对于任何想要一个类似 Angular 的框架的人(只是为了支持旧版浏览器),请查看 durandal:http ://durandaljs.com/ (似乎正在获得对淘汰和 Angular 粉丝的支持)

(更新 - 2014 年 8 月 11 日 - 我在浏览器中删除了有关 [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,请确保在微风的服务调用中关闭 hasServerMetadata。

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

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

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

于 2014-02-10T16:18:06.887 回答
1

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

我们从一开始就在我们的文档中对此非常清楚和坦率。例如,请参阅“Todo Angular 示例”Breeze/Angular页面上的蓝色大通知框。

使用术语“breeze angular ie8”搜索 StackOverflow 会返回2013 年 1 月的问题和答案,其中我们再次明确指出,Breeze 和 Angular 的组合不起作用,并且永远不会在 IE8 或任何缺乏支持的浏览器中起作用带有 getter 和 setter 的 ECMAScript 5 属性。

您是否知道 Angular 团队也在 1.x 版本序列中的所有未来版本中放弃了对 IE8 的支持?他们说它可能在 IE8 中工作,但他们不会进一步尝试确保它可以......他们也不会费心测试它是否可以。

我应该补充一点,尽管我们也已经停止在 IE8 上测试 Breeze,但 Breeze 在 IE8(可能还有 IE7)中可以很好地与 Knockout(和 Durandal)配合使用。

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

于 2014-02-09T05:41:12.853 回答