Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象没有';不支持IE8中的此属性或方法:\u normalizeServiceName_Javascript_Internet Explorer 8_Breeze - Fatal编程技术网

Javascript 对象没有';不支持IE8中的此属性或方法:\u normalizeServiceName

Javascript 对象没有';不支持IE8中的此属性或方法:\u normalizeServiceName,javascript,internet-explorer-8,breeze,Javascript,Internet Explorer 8,Breeze,我正在将我的应用程序从.NET 4.0升级到4.5,并将Breeze.js从1.4.17升级到1.5.4。在IE11和其他浏览器中,情况似乎运行良好,但在IE8(或IE8模式下的IE11)中,我收到了一个“对象不支持此属性或方法”错误,该错误与本节代码中的\u normalizeServiceName方法有关: function updateWithConfig(obj, config) { if (config) { assertConfig(config) .wh

我正在将我的应用程序从.NET 4.0升级到4.5,并将Breeze.js从1.4.17升级到1.5.4。在IE11和其他浏览器中,情况似乎运行良好,但在IE8(或IE8模式下的IE11)中,我收到了一个“对象不支持此属性或方法”错误,该错误与本节代码中的
\u 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;
}
如果我跟踪定义了
DataService
的位置,
ctor
确实在返回时定义了
\u normalizeServiceName
方法,但在调用
updateWithConfig
时,
DataService
中缺少该方法

当我创建新的
EntityManager
时发生错误:

this.manager = new breeze.EntityManager(appRoot + "breeze/myapp");
Breeze网站似乎表示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中仍然受支持吗?当从Breeze 1.4.x升级到1.5.x时,我是否遗漏了需要在代码中更新的内容(我唯一更改的是与
Promise
API似乎要更改相关的内容)?或者这是Breeze中的一个bug?

也许不是“Breeze是否支持IE8”的答案,但我想我会记录下我所做的一切,以使事情再次运行,以防它对其他人有所帮助

第一个问题是IE8不喜欢中引入的命名构造函数(如果这是正确的术语)。为了解决这个问题,我在我的
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);
});
另外,由于我使用的是TypeScript,Breeze当前的类型定义了一个
IPromise
接口(在中从
Q.Promise
更改为支持Angular),该接口使用IE8不喜欢的方法名(catch,final),并且没有定义ES3友好的别名(fail,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>;
    }
}
声明模块breeze.promises{
//IE8(和其他ES3浏览器?)不喜欢.catch和.finally
//还要定义Q's.done方法。
接口协议{
完成():i promise;
失败(onRejected:(原因:任意)=>U):i放弃;
失败(onRejected:(原因:任意)=>IPromise):IPromise;
fin(finallyCallback:()=>any):i推荐;
}
}
最后,作为升级的一部分,我将es5 shim更新到了v4.5.7,这似乎也破坏了IE8,尽管目前我不知道如何/为什么。我不知道我以前使用的是什么版本(在.js文件中找不到版本号),因为我很久以前就手动复制了它。我必须回到v4.1.7,才能找到一个可以工作的版本,所以可能是v4.1.8中的某些东西打破了IE8

有了这些,IE8的工作似乎又开始了

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>;
    }
}