2016-03-07 165 views
0

我升级我的应用程序从.NET 4.0到4.5,从1.4.17升级到Breeze.js 1.5.4。事情似乎在IE11和其他浏览器运作良好,但在IE8(或IE11在IE8模式),我得到一个“对象不支持此属性或方法”错误与在这部分代码的_normalizeServiceName方法:对象不支持在IE8此属性或方法:_normalizeServiceName

function updateWithConfig(obj, config) { 
    if (config) { 
    assertConfig(config) 
     .whereParam("serviceName").isOptional() 
     .whereParam("adapterName").isString().isOptional() 
     .whereParam("uriBuilderName").isString().isOptional() 
     .whereParam("hasServerMetadata").isBoolean().isOptional() 
     .whereParam("jsonResultsAdapter").isInstanceOf(JsonResultsAdapter).isOptional() 
     .whereParam("useJsonp").isBoolean().isOptional() 
     .applyAll(obj); 
    obj.serviceName = obj.serviceName && DataService._normalizeServiceName(obj.serviceName); // <<< Error here 
    obj.adapterInstance = obj.adapterName && __config.getAdapterInstance("dataService", obj.adapterName); 
    obj.uriBuilder = obj.uriBuilderName && __config.getAdapterInstance("uriBuilder", obj.uriBuilderName); 
    } 
    return obj; 
} 

我可以看到_normalizeServiceName方法被定义权updateWithConfig后:

ctor._normalizeServiceName = function (serviceName) { 
    serviceName = serviceName.trim(); 
    if (serviceName.substr(-1) !== "/") { 
    return serviceName + '/'; 
    } else { 
    return serviceName; 
    } 
}; 

如果我跟踪过那里DataService定义,ctor确实有返回时,它定义的_normalizeServiceName方法,而是通过时间updateWithConfig是称为从DataService丢失。

的错误,当我创建一个新的EntityManager发生:

this.manager = new breeze.EntityManager(appRoot + "breeze/myapp"); 

微风网站似乎是说,IE8仍然支持。我有条件注释中引用了ES5 Shim/Sham脚本:

<!--[if lt IE 9]> 
<script src="/myapp/js/respond.js"></script> 
<script src="/myapp/js/es5-shim.js"></script> 
<script src="/myapp/js/es5-sham.js"></script> 
<script src="/myapp/js/json3.js"></script> 
<![endif]--> 

那么,IE8仍然支持Breeze?我错过了什么,我需要在我的代码更新从微风1.4.x中去1.5.x的(我唯一改变的事情是关系到Promise API似乎改变)时?或者这是微风中的一个错误?

回答

0

也许不是回答“不支持微风IE8”,但我想我会记录我做了什么,把事情弄好,如果它可以帮助别人。

的第一个问题是,IE8不喜欢命名的构造函数(如果这甚至正确的术语)在this commit to breeze.js介绍。要解决这个问题,我添加了一个步替换我gulpfile.js删除函数名称:

gulp.task("breeze", function() { 
    var js = gulp 
     .src(src.bower + "breeze-client/build/breeze.debug.js") 
     .pipe(replace(/var ctor = function (\w+)/g, "var ctor = function ")) 
     .pipe(rename("breeze.js")) 
     .pipe(gulp.dest(dest.js)); 
    return merge(js); 
}); 

而且,由于我使用的打字稿,为微风目前的分型定义IPromise接口(在this commitQ.Promise改变,大概是为了支持Angular),它使用IE8不喜欢的方法名称(最终捕获),并且没有定义ES3友好的别名(失败,fin)。我说我自己的定义,并且还定义将q done()方法:

declare module breeze.promises { 
    // IE8 (and other ES3 browsers?) don't like .catch and .finally 
    // Also define Q's .done method. 
    interface IPromise<T> { 
     done<U>(): IPromise<U>; 
     fail<U>(onRejected: (reason: any) => U): IPromise<U>; 
     fail<U>(onRejected: (reason: any) => IPromise<U>): IPromise<U>; 
     fin(finallyCallback:() => any): IPromise<T>; 
    } 
} 

最后,我已经更新ES5,垫片,以v4.5.7作为我的升级,这似乎打破IE8太的一部分,虽然我没有想法如何/为什么在这一刻。我不知道以前使用的是什么版本(无法在.js文件中找到版本号),因为很久以前我已经手动复制了它。我不得不一直回到v4.1.7来找到一个可以工作的版本,所以大概是v4.1.8中的一些东西会打破IE8。

有了这一切,事情似乎在IE8工作了!

相关问题